- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 语言结构体对齐
C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容
虽然很基础,但一不小心就会弄错。写出一个 struct,然后 sizeof,你会不会经
常对结果感到奇怪?sizeof 的结果往往都比你声明的变量总长度要大,这是怎么
回事呢?
开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感觉说清楚
的不多。结构体到底怎样对齐?
有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下
前人的经验(在没有#pragma pack 宏的情况下):
原则1、数据成员对齐规则:结构(struct 或联合union )的数据成员,第一
个数据成员放在offset 为0 的地方,以后每个数据成员存储的起始位置要从该成
员大小的整数倍开始(比如int 在32 位机为4字节,则要从4 的整数倍地址开始
存储)。
原则2 、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成
员要从其内部最大元素大小的整数倍地址开始存储。(struct a 里存有struct b,b
里有char,int,double 等元素,那b 应该从8 的整数倍开始存储。)
原则 3、收尾工作:结构体的总大小,也就是 sizeof 的结果,必须是其内部
最大成员的整数倍,不足的要补齐。
这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。
例1:struct {
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
sizeof(A) = 6; 这个很好理解,三个short 都为2 。
sizeof(B) = 8; 这个比是不是比预想的大2 个字节?long 为4 ,short 为2,
整个为8,因为原则3 。
例2 :struct A{
int a;
char b;
short c;
};
struct B{
char b;
int a;
short c;
};
sizeof(A) = 8; int 为4 ,char 为1,short 为2 ,这里用到了原则1 和原则3 。
sizeof(B) = 12; 是否超出预想范围?char 为1,int 为4 ,short 为2 ,怎么
会是12?还是原则1 和原则3 。
深究一下,为什么是这样,我们可以看看内存里的布局情况。
a b c
A 的内存布局:1111, 1*, 11
b a c
B 的内存布局:1***, 1111, 11**
其中星号*表示填充的字节。A 中,b 后面为何要补充一个字节?因为c
为short,其起始位置要为2 的倍数,就是原则1。c 的后面没有补充,因为b 和
c 正好占用4 个字节,整个A 占用空间为4 的倍数,也就是最大成员int 类型的
倍数,所以不用补充。
B 中,b 是char 为1,b 后面补充了3 个字节,因为a 是int 为4 ,根据
原则1,起始位置要为4 的倍数,所以b 后面要补充3 个字节。c 后面补充两个
字节,根据原则3,整个B 占用空间要为4 的倍数,c 后面不补充,整个B 的空
文档评论(0)