[备忘]内存对齐问题


昨天和wub讨论,为什么struct对齐的时候,double类型的地址要以8对齐。
对齐的目的就是为了方便和加速处理器读取,那么只需要和字长对齐就可以了。
根据这两篇文章:《内存对齐与ANSI C中struct型数据的内存布局》vs《难以理解的《内存对齐与ANSI C中struct型数据的内存布局》gcc和vc下是不同的。对于double类型,默认gcc的对齐模数是4,VC是8.
内存对齐是与处理器,编译器,编译选项相关的,因此单纯给出一个struct,问其sizeof是多少,这样的问法是不严谨的。回答该问题,应该加以说明运行环境。
vc的默认对齐模数是:sizeof(该类型)
gcc的默认对齐规则是:byte为1,char为2,其他均为4.

由上可知
struct s{
 char c;
 double d;
};

gcc下
sizeof(s) = 4+8 = 12
vc下
sizeof(s) = 8+8 = 16

那么 struct s{
double d;
char c;
};
起初我认为c以后不需要填充,因此gcc下sizeof(s)=8+1 = 9。但事实应该是sizeof(s)==8+4 = 12。
因为对于数组来说,要保证数组的大小等于数组的个数乘以元素的大小。因此c之后也是需要填充的,这样后续的元素的地址才会是字长的倍数。

posted on 2009-07-15 16:37 YZY 阅读(311) 评论(0)  编辑 收藏 引用 所属分类: Miscellaneous备忘


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜