32位和64位系统,数据类型字节数和结构体对齐区别

8090阅读 0评论2014-02-27 shaohui973
分类:LINUX

程序的结构体对齐字节数由编译选项参数来控制。

默认情况下,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个字节。 
上一篇:高速缓存与局部性
下一篇:删除".SVN"文件夹方法