CC结构体字节对齐详解.docx

CC结构体字节对齐详解.docx

ID:62033185

大小:15.71 KB

页数:3页

时间:2021-04-15

CC结构体字节对齐详解.docx_第1页
CC结构体字节对齐详解.docx_第2页
CC结构体字节对齐详解.docx_第3页
资源描述:

《CC结构体字节对齐详解.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C/C++结构体字节对齐详解注意:成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体.struct{chara;shortb;charc;}S1;struct{chara;charb;s

2、hortc;}S2;分别用程序测试得出sizeof(S1)=6,sizeof(S2)=4可见,虽然两个结构体所含的元素相同,但因为其中存放的元素类型顺序不一样,所占字节也出现差异。这就是字节对齐原因。通过字节对齐,有助于加快计算机的取数速度,否则就得多花指令周期。字节对齐原则结构体默认的字节对齐一般满足三个准则:1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2)结构体每个成员相对于结构体首地址的偏移量(offset,即每个成员的起始地址)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上

3、填充字节(internaladding);3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。注意:当结构体成员里面有数组成员时,如inta[10],要看成10个整形变量才参与计算。通过这三个原则,就不难理解上面两个struct的差异了.对于structS1,为了使short变量满足字节对其准则(2),即其存储位置相对于结构体首地址的offset是自身大小(short占2个字节)的整数倍,必须在字节a后面填充一个字节以对齐

4、;再由准则(3),为了满足结构体总大小为short大小的整数倍,必须再在c后面填充一个字节。对于structS2,却不必如上所述的填充字节,因为其直接顺序存储已经满足了对齐准则。如果将上面两个结构体中的short都改为int(占4个字节),那么会怎么样呢?程序得出sizeof(S1)=12,sizeof(S2)=8利用上面的准则,也不难计算得出这样的结果。S1中在a后面填充3个字节、在c后面填充3个字节,这样一共12个字节;S2中在a、b顺序存储之后填充两个字节用以对其,这样一共就8个字节。当然,在某些时候

5、也可以设置字节对齐方式。这就需要使用#pragmapack。#pragmapack(push)//压栈保存#pragmapack(1)//设置1字节对齐struct{chara;shortb;charc;}S1;#pragmapack(pop)//恢复先前设置如上所示,将对其方式设为1字节对齐,那么S1就不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.另外,还有如下的一种方式:·__attribute((aligned(n)

6、)),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。·__attribute__((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。空结构体structS3{};sizeof(S3);//结果为1“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。有static

7、的结构体structS4{chara;longb;staticlongc;//静态};静态变量存放在全局数据区内,而sizeof计算栈中分配的空间的大小,故不计算在内,S4的大小为4+4=8。structS5{charc;inti;};structS6{   charc1;   S5s;   charc2};S5的最宽简单成员的类型为int,S6在考虑最宽简单类型成员时是将S5“打散”看的,所以S6的最宽简单类型为int,这样,通过S6定义的变量,其存储空间首地址需要被4整除,整个sizeof(S6)的值也

8、应该被4整除。c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。最后得到sizeof(S6)的值为16。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。