- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
转载自:/21aspnet/article/details/6729724#comments ,方便大家参考学习
C语言字节对齐
C
CC
分类: C基础2011-08-29 16:0624952人阅读评论(50)收藏举报
c 语言struct编译器数据结构alignment
文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。
一、概念
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,
他就被称做自然对齐。比如在32位cpu 下,假设一个整型变量的地址为0那它
就是自然对齐的。
二、为什么要字节对齐
需要字节对齐的根本原因在于CPU 访问数据的效率问题。假设上面整型变量的地址
不是自然对齐,比如为0则CPU 如果取它的值的话需要访问两次内存,第一
次取从00一个short,第二次取从00一
个short然后组合得到所要的数据,如果变量在0址上的话则要访问三次内存,
第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自
然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc
系统,如果取未对齐的数据会发生错误,举个例:
char ch[8];
char *p = ch[1];
int i = *(int *)p;
运行时会报segment error,而在x86上就不会出现错误,只是效率下降。
三、正确处理字节对齐
对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按
下面的原则对齐:
数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
联合 :按其包含的长度最大的数据类型对齐。
结构体: 结构体中每个数据类型都要对齐。
比如有如下一个结构体:
struct stu{
char sex;
int length;
char name[10];
};
struct stu my_stu;
由于在x86下,GCC默认按4字节对齐,它会在sex 后面跟name后面分别填充三个和
两个字节使length 和整个结构体对齐。于是我们sizeof(my_stu)会得到长度为20,而不是
15.
四、__attribute__选项
我们可以按照自己设定的对齐大小来编译程序,GNU使用__attribute__选项来设置,
比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构体
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((aligned (1)));
struct stu my_stu;
则sizeof(my_stu)可以得到大小为15。
上面的定义等同于
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((packed));
struct stu my_stu;
__attribute__((packed))得变量或者结构体成员使用最小的对齐方式,即对变量是一字
节对齐,对域(field)是位对齐.
五、什么时候需要设置对齐
在设计不同CPU 下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地
方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生
成的代码不一样.
一、快速理解
1. 什么是字节对齐?
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、
float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在
结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它
们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
为了使CPU能够对变量进行快速的访问,变量的起始地址应该具
文档评论(0)