程序的结构体对齐字节数由编译选项参数来控制。
默认情况下,32位器为4字节对齐;64位机器为8字节对齐;
`-malign-double'
`-mno-align-double'
Control whether GCC aligns `double', `long double', and `long
long' variables on a two word boundary or a one word boundary.
Aligning `double' variables on a two word boundary will produce
code that runs somewhat faster on a `Pentium' at the expense of
more memory.
On x86-64, `-malign-double' is enabled by default.
32位系统中,结构体内成员地址分配时,编译器默认考虑4字节对齐;
64位系统中, 编译器默认考虑8字节对齐。
对于内部临时需要更改的结构体对齐方式,可通过如下方式:
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体
仍然按照size 最大的成员进行对界。
最好是这么做:
#pragma pack(push) #保存当前的对齐方式
#pragma pack(1) #设置对齐方式为1字节对齐
struct test
{
......
};
#pragma pack(pop) #恢复之前的对齐方式
Linux系统32位与64位数据类型长度比较