Chinaunix首页 | 论坛 | 博客
  • 博客访问: 750174
  • 博文数量: 215
  • 博客积分: 291
  • 博客等级: 二等列兵
  • 技术积分: 1031
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 18:17
文章分类

全部博文(215)

文章存档

2016年(16)

2015年(16)

2014年(123)

2013年(60)

分类: LINUX

2014-02-27 09:04:27

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

默认情况下,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个字节。 
阅读(7768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~