HUST16届准毕业生,发奋求职中...
分类: C/C++
2015-04-09 14:18:26
运行结果如下图:
char占1个字节,short占2个字节,double占8个字节。
在系统默认的情况下,结构体会进行对齐,对齐的原则如下:
原则A:struct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;
原则B:如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址;
原则C:结构体的总大小,必须是内部最大成员的整数倍;
因而,对test1而眼,x1是char型,偏移量为0,x2是short型,起始位置应该是2,故在x1和x2之间就会有一个空的字节,而x3是double,所以它的起始位置是8,因而x2和x3之间就会有4个空字节,最后x4是char,占据一个字节,而结构体的总大小是最大成员的整数倍,则char之后会填充7个空字节。最后共占用24个字节
而对于test2,x1和x2都是char ,所以它们其实位置分别是0和1,x4是short,所以起始位置是2,而x3是double,起始位置是8,所以x4和x3之间就会存在4个空字节,最后共占用16个字节。
那么如何修改这种默认分配策略呢?
可以使用伪指令#pragma pack(n)
当n=1时,看下输出的结果:
结果如下:
都是12,当加上#pragma pack(n)时,以上的原则A和原则C将不再生效。
那么编译器为什么要采取结构体对齐的方式呢?
这其实是计算机在时间和空间上的一个权衡,对齐的形式更加有利于计算机进行快速的处理,在可接受的空间浪费的前提下,对齐使计算机处理需要的的时间尽可能的少。 而我们在设计结构体的时候也一定要考虑结构体的对齐,因为不当的顺序会消耗大量的额外内存。