当我们写一个class类,然后sizeof(),然后发现这个值往往比你想象的大,这是为什么呢?这里就要讲到内存对齐的问题。

先来看一下内存对齐的几条原则:

1.对于class(struct/union)的各个成员,第一个数据成员放在偏移为0的地方,以后每个数据成员存储的其实位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始;

2.结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储;

3.结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足要补齐。

下面看一个小例子:

#include<iostream>
using namespace std; class student
{
private:
int number;//0-3
double weight;//8-15
char name[];//16-25
char sex[];//26-29
};//补齐29-32 class student s;
class teacher
{
private:
int number;//0-3
char name[];//4-13
char sex[];//14-17
public:
student s[];//24-88
}; int main()
{
student s;
teacher t;
cout<<"student:"<<sizeof(s)<<endl;
cout<<"teacher:"<<sizeof(t)<<endl;
return ;
}

(补充讲一下,“student s[2]”是从24开始的,因为s的子成员weight的大小是8,所以从它的整数倍,也就是24开始。)

结果是:
student: 24

teacher: 88

下面就来解释一些疑问:

1.什么是对齐?

现代计算机中内存空间都是按照byte划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

2.为什么要对齐呢?

硬件限制:不是所有的硬件平台都能访问任意地址上的数据;某些硬件平台只能在某些地址取特定类型的数据,否则抛出硬件异常。

提高性能:内存对齐后,CPU的内存访问速度大大提升。

3.那些情况要考虑内存对齐?

在不同平台之间(比如windows和linux),不同模块之间(dll与exe)传递二进制流(如结构体),必须要定义相同的对齐方式。

序列化与反序列化的操作时,也必须要定义相同的对齐方式。

OK.

[C++]内存字节对齐的更多相关文章

  1. c语言,内存字节对齐

    引用:内存字节对齐 写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧. /************* ...

  2. C++:struct和union 内存字节对齐问题

    转自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049 struct内存对齐问题 1:数据成员对齐规则:结构(struct) ...

  3. C++内存字节对齐规则

    为什么要进行内存对齐以及对齐规则 C/C++—— 内存字节对齐规则 C++内存字节对齐规则

  4. C语言:内存字节对齐详解[转载]

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  5. struct/class等内存字节对齐问题详解

    问题引入 定义一个结构体的一般形式为: struct 结构体名 { //类型说明符 成员名; }; 例如有如下结构体: struct Stu { int id; char sex; float hig ...

  6. C语言:内存字节对齐详解

    转:http://blog.csdn.net/arethe/article/details/2548867 一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论 ...

  7. 【C语言】字节对齐(内存对齐)

    数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...

  8. 字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃

    本文原链接: http://www.cnblogs.com/zouzf/p/4455167.html 先看一下这个链接:http://www.cnblogs.com/ren54/archive/201 ...

  9. C语言结构体变量字节对齐问题总结

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...

随机推荐

  1. 内核堆分配函数brk()源码分析

    Evernote公开链接:http://www.evernote.com/shard/s133/sh/5b8d3b26-0e53-4c61-aa43-66f6e87bbcb7/a44096dd557f ...

  2. Oracle DBLINK 抽数以及DDL、DML操作

    DB :  11.2.0.3.0 原库实例orcl:SQL> select instance_name from v$instance; INSTANCE_NAME--------------- ...

  3. Linux下如何将数据库脚本文件从sh格式变为sql格式

    在从事软件开发的过程中,经常会涉及到在Linux下将数据库脚本文件从sh格式变为sql格式的问题.本文以一个实际的脚本文件为例,说明格式转换的过程.        1. sh文件内容 本文中的文件名为 ...

  4. sed实例一则

    1.背景: test.txt文件里有这些语句 li^E1026^D20150802B07QH800^B698.^C20150801B08CDP00^B514.^C20150803D00A8L00^B2 ...

  5. EF4.1之贪婪加载和延迟加载

    默认情况下,EF4.1是只查询到涉及到的数据对象,但是EF4.1支持两种方法进行控制其加载: 1.贪婪加载 2.延迟加载 使用的表还是上次使用的Order 和 OrderDetails两张表来举例说明 ...

  6. apache maven

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAj0AAAGXCAYAAABY/uEUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw ...

  7. tomcat设置内存大小

    -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

  8. 升级ubuntu内核

    ubuntu12.04内核为 linux-image-3.5.0-23-generic 要升级为 linux-image-3.2.0-57-generic 使用apt-get install linu ...

  9. kernel nf_conntrack: table full, dropping packet[转载]

    http://blog.yorkgu.me/2012/02/09/kernel-nf_conntrack-table-full-dropping-packet/ 综合:ip_conntrack就是li ...

  10. 关于Liferay所有的能够进行自定义和扩展的东西的总结

    非常超级什么有用的东西,amazing. 虽然不是宝宝写的. Fantastic Extension Points - And Where to Find Them