- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言字节对齐问题详解
时间:2014-07-19 00:37:40????? 阅读:2315????? 评论:0????? 收藏:0??????[点我收藏+]
标签: HYPERLINK /so/1/%E7%AE%97%E6%B3%95 \o 算法 算法??? HYPERLINK /so/1/class \o class class??? HYPERLINK /so/1/%E4%BB%A3%E7%A0%81 \o 代码 代码??? HYPERLINK /so/1/style \o style style??? HYPERLINK /so/1/int \o int int??? HYPERLINK /so/1/html \o html html???
? ?
引言
? ? ?考虑下面的结构体定义:
1 typedef struct{
2 char c1;
3 short s;
4 char c2;
5 int i;
6 }T_FOO;
? ? ?假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4。
? ? ?现在,我们编写一个简单的程序:
1 int main(void){
2 T_FOO a;
3 printf(c1 - %d, s - %d, c2 - %d, i - %d\n,
4 (unsigned int)(void*)a.c1 - (unsigned int)(void*)a,
5 (unsigned int)(void*)a.s - (unsigned int)(void*)a,
6 (unsigned int)(void*)a.c2 - (unsigned int)(void*)a,
7 (unsigned int)(void*)a.i - (unsigned int)(void*)a);
8 return 0;
9 }
? ? ?运行后输出:?
1 c1 - 0, s - 2, c2 - 4, i - 8
? ? ?为什么会这样?这就是字节对齐导致的问题。
? ? ?本文在参考诸多资料的基础上,详细介绍常见的字节对齐问题。因成文较早,资料来源大多已不可考,敬请谅解。
?
?
一 ?什么是字节对齐
? ? ?现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。
?
二 ?对齐的原因和作用
? ? ?不同硬件平台对存储空间的处理上存在很大的不同。某些平台对特定类型的数据只能从特定地址开始存取,而不允许其在内存中任意存放。例如Motorola 68000 处理器不允许16位的字存放在奇地址,否则会触发异常,因此在这种架构下 HYPERLINK /cpro/ui/uijs.php?adclass=0app_id=0c=newscf=1001ch=0di=128fv=18is_app=0jk=f189cb314cc6d212k=%B1%E0%B3%CCk0=%B1%E0%B3%CCkdi0=0luki=4n=10p=baiduqcprrb=0rs=1seller_id=1sid=12d2c64c31cb89f1ssp2=1stid=0t=tpclicked3_hctd=1836545tu=u1836545u=http%3A%2F%2Fwww%2Ebubuko%2Ecom%2Finfodetail%2D263205%2Ehtmlurlid=0 \t _blank 编程必须保证字节对齐。
? ? ?但最常见的情况是,如果不按照平台要求对数据存放进行对齐,会带来存取效率上的损失。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。
? ? ?因此,通过合理的内存对齐可以提高访问效率。为使CPU能够对数据进行快速访问,数据的起始地址应具有“对齐”特性。比如4字节数据的起始地址应位于4字节边界上,即起始地址能够被4整除。
? ? ?此外,合理利用字节对齐还可以有效地节省存储空间。但要注意,在32位机中使用1字节或2字节对齐,反而会降低变量访问速度。因此需要考虑处理器类型。还应考虑
原创力文档


文档评论(0)