- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c中字节序问题
C语言字节对齐问题详解时间:2014-07-19 00:37:40????? 阅读:2315????? 评论:0????? 收藏:0??????[点我收藏+]标签:算法???class???代码???style???int???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位的字存放在奇地址,否则会触发异常,因此在这种架构下编程必须保证字节对齐。? ? ?但最常见的情况是,如果不按照平台要求对数据存放进行对齐,会带来存取效率上的损失。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。? ? ?因此,通过合理的内存对齐可以提高访问效率。为使CPU能够对数据进行快速访问,数据的起始地址应具有“对齐”特性。比如4字节数据的起始地址应位于4字节边界上,即起始地址能够被4整除。? ? ?此外,合理利用字节对齐还可以有效地节省存储空间。但要注意,在32位机中使用1字节或2字节对齐,反而会降低变量访问速度。因此需要考虑处理器类型。还应考虑编译器的类型。在VC/C++和GNU GCC中都是默认是4字节对齐。???三 ?对齐的分类和准则? ? ?主要基于Intel X86架构介绍结构体对齐和栈内存对齐,位域本质上为结构体类型。? ? ?对于Intel X86平台,每次分配内存应该是从4的整数倍地址开始分配,无论是对结构体变量还是简单类型的变量。3.1 结构体对齐? ? ?在C语言中,结构体是种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构体、联合等)的数据单元。编译器为结构体的每个成员按照其自然边界(alignment)分配空间。各成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。? ? ?字节对齐的问题主要就是针对结构体。3.1.1 简单示例? ? ?先看个简单的例子(32位,X86处理器,GCC编译器):? ? 【例1】设结构体如下定义: 1 struct A{ 2 int a; 3 char b; 4 short c; 5 }; 6 struct B{ 7 char b; 8 int a; 9 short c;10 };? ? ?已知32位机器上各数据类型的长度为:char为1字节、short为2字节、int为4字节、long为4字
您可能关注的文档
- CPK的介绍以及计算公式.ppt
- CPLD的智能数字电压表毕业论文.doc
- CO成本月结操作, 收入8000以上.ppt
- CR110零件图.doc
- Creo 2.0 工程命令--骨架折弯修饰草绘、螺纹、槽.doc
- Creo2.0_草绘电子教程.ppt
- CPC课件.ppt
- CRH1型动车组新司机培训内容.doc
- CRM一般模型讲解.pptx
- CROCS产品清单 20130603.ppt
- 北师大版小学数学三年级上册《寄书》教学设计.docx
- 统编版(部编版)语文二年级上册《雪孩子》教学设计.docx
- 统编版(部编版)语文二年级上册《八角楼上》教学设计.docx
- 北师大版小学数学三年级上册《长方形周长》教学设计.docx
- 北师大版小学数学三年级上册《丰收了》教学设计.docx
- 统编版(部编版)语文二年级上册《夜宿山寺》教学设计.docx
- 统编版(部编版)语文二年级上册《风娃娃》教学设计.docx
- 统编版(部编版)语文二年级上册《朱德的扁担》教学设计.docx
- 统编版(部编版)语文二年级上册《难忘的泼水节》教学设计.docx
- 统编版(部编版)语文二年级上册《纸船和风筝》教学设计.docx
文档评论(0)