如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
[C++]字节对齐与结构体大小说明:结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。别忘了这里HYPERLINK"http://pppboy.blog.163.com/blog/static/30203796201082494026399/"http://pppboy.blog.163.com/blog/static/30203796201082494026399/一、解释现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。二、准则其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2.结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。三、基本概念字节对齐:计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字节,短整型(short)数据占两个字节,等等。计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储在地址能被4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),短整型(short)数据存储在地址能被2整除的起始位置。这就是默认字节对齐方式。四、结构体长度求法1.成员都相同时(或含数组且数组数据类型同结构体其他成员数据类型):结构体长度=成员数据类型长度×成员个数(各成员长度之和);结构体中数组长度=数组数据类型长度×数组元素个数;2.成员不同且不含其它结构体时;(1).分析各个成员长度;(2).找出最大长度的成员长度M(结构体的长度一定是该成员的整数倍);(3).并按最大成员长度出现的位置将结构体分为若干部分;(4).各个部分长度一次相加,求出大于该和的最小M的整数倍即为该部分长度(5).将各个部分长度相加之和即为结构体长度3.含有其他结构体时:(1).分析各个成员长度;(2).对是结构体的成员,其长度按b来分析,且不会随着位置的变化而变化;(3).分析各个成员的长度(成员为结构体的分析其成员长度),求出最大值;(4).若长度最大成员在为结构体的成员中,则按结构体成员为分界点分界;其他成员中有最大长度的成员,则该成员为分界点;求出各段长度,求出大于该和的最小M的整数倍即为该部分长度(5).将各个部分长度相加之和即为结构体长度五、空结构体structS5{};sizeof(S5);//结果为1“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。六、有static的结构体structS4{chara;longb;staticlongc;//静态};静态变量存放在全局数据区内,而sizeof计算栈中分配的空间的大小,故不计算在内,S4的大小为4+4=8。七、举例说明1.举例1很显然默认对齐方式会浪费很多空间,例如如下结构:structstudent{charname[5];intnum;shortscore;}