本帖最后由 M.W 于 2016-6-19 10:50 编辑
结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被 称为该数据类型的对齐模数(alignmentmodulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。 比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类 型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。
计算结构体变量在内存中占用的字节数的方法: 1)先找对齐模数 对齐模数:是结构体中基本数据类型中占用字节数最大的那个 2)再计算结构体变量中各成员占用的字节之和 剩余分配的空间如果足够装得下下一个元素,那么就装,装不下就再分配一个对齐模数的整数倍的空间(定义变量顺序会有影响(但不常见)) - struct A{
- char a; //1
- char b; //1
- float c; //4
- //-->模数是4,4可以装下a和b,所以A占用的是8个字节
- };
-
- struct B{
- char a[13]; //13
- char b; //1
- int c; //4
- //模数是4,a[13]占用4个模数:4 * 4 = 16,剩下的3个字节可以装得下成员b,所以,B的大小时20
- };
-
- struct C{
- char *a; //8
- int *b; //8
- int c; //4
- //模数是8,8 * 3 = 24
- };
- //定义结构体变量
- struct A a;
- struct B b;
- struct C c;
- printf("sizeof(a) = %ld\n", sizeof(a)); //8
- printf("sizeof(b) = %ld\n", sizeof(b)); //20
- printf("sizeof(c) = %ld\n", sizeof(c)); //20
复制代码 --如有不妥或错误之处,望提出指正
|