程序的结构体对齐字节数由编译选项参数来控制。
默认情况下,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位数据类型长度比较
可通过getconf命令来获取。
系统32位与64位GCC编译器基本数据类型长度对照表
GCC 32位
sizeof(char)=1
sizeof(double)=8
sizeof(float)=4
sizeof(int)=4
sizeof(short)=2
sizeof(long)=4
sizeof(long long)=8
sizeof(long double)=12
sizeof(complex long double)=24
指针是4字节;
GCC 64位
sizeof(char)=1
sizeof(double)=8
sizeof(float)=4
sizeof(int)=4
sizeof(short)=2
sizeof(long)=8
sizeof(long long)=8
sizeof(long double)=16
sizeof(complex long double)=32
指针是8字节
转自:
32位,指针占用4个字节;
64位,指针占用8个字节。
阅读(7933) | 评论(0) | 转发(0) |