结构体中数据的对齐性

2019-04-14 11:56发布

对齐         对齐性是一内存地址的特性,表现为内存地址模上 2 。例如,内存地址 0x0001103F 4 3 个地址就叫做与 4n 3 对齐 4 指出了所用的 2 。内存地址的对齐性取决于所选择 2 幂值。同的地址模 8 7          一个内存地址符合表达式 Xn 0 ,那说该地址对齐 X          CPU 行指令就是于内存上的数据行操作,些数据在内存上是以地址为标记的。于地址来独的数据会有其占用内存的字数。如果它的地址对齐于它的字数,那就称作数据自然对齐,否对齐。例如,一个标记 8 的浮点数据的地址对齐 8 ,那么这数据就自然对齐   数据对齐性的编译处        设备编译器以一防止造成数据未对齐的方式来数据行地址分配。          个的数据型,编译其分配的地址是数据型字数的倍数。因此,编译器分配 long 量的地址 4 的倍数,就是 2 制表示地址的,最后两位 0          另外,编译器以一自然对齐每构成的方式来填充构体。参看下面的代里面的构体 struct x_        struct x_       {             char a;     // 1 byte             int b;      // 4 bytes             short c;    // 2 bytes             char d;     // 1 byte       } MyStruct;         编译器填充构以使其自然对齐   例如       下面的代码说明了编译器是如何在内存中填充的。         // Shows the actual memory layout       struct x_      {            char a;            // 1 byte            char _pad0[3];     // padding to put 'b' on 4-byte boundary            int b;            // 4 bytes            short c;          // 2 bytes            char d;           // 1 byte            char _pad1[1];    // padding to make sizeof(x_) multiple of 4      }        在作sizeof(struct x_)运算都会返回12         第二含有两填充成分:                *char _pad0[3]使得int b 4节边界上对齐                *char _pad1[1]使得构数struct _x  bar[3]对齐              填充使得bar[3]各个量能自然对齐   看下面的构: struct MyStruct { double dda1; char dda; int type }; 对结MyStruct采用sizeof会出么结果呢?sizeof(MyStruct)多少呢?也你会这样求: sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 但是当在VC测试上面构的大小,你会发现sizeof(MyStruct)16。你知道VC中会得出这样一个 VC对变量存的一个特殊理。了提高CPU的存速度,VC一些量的起始地址做了“对齐理。在默情况下,VC定各成员变量存放的起始地址相构的起始地址的偏移量必须为该变量的型所占用的字数的倍数。下面列出常用型的对齐方式(vc6.0,32位系) 对齐方式(量存放的起始地址相构的起始地址的偏移量) Char 偏移量必须为sizeof(char)1的倍数 int 偏移量必须为sizeof(int)4的倍数 float 偏移量必须为sizeof(float)4的倍数 double 偏移量必须为sizeof(double)8的倍数 Short 偏移量必须为sizeof(short)2的倍数 各成员变量在存放的候根据在构中出序依次申,同按照上面的对齐方式整位置,空缺的字VC会自