欢迎来到天天文库
浏览记录
ID:27611996
大小:95.50 KB
页数:8页
时间:2018-12-05
《sizeof结构体》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、sizeof是C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数。1.sizeof基本数据类型这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意。但是,这同编译器也有关系。如果编译器定义int等价shortint,sizeof(int)就是2―TC如此如果编译器定义int不等价shortint,sizeof(int)就是4—VC++如此2.sizeof指针变量在32位
2、计算机中,一个指针变量的sizeof结果通常是4(注意结果是以字节为单位),在64位系统中指针变量的sizeof结果通常为8,此外指针变量的sizeof值与指针所指的对象没有任何关系。3.sizeof数组数组的sizeof值等于数组所占用的内存字节数。4.sizeof结构体编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就讨能需要加入填充字节,所以结构体的sizeof值就不是
3、简单的成员的sizeof相加了。字节对齐的细节和编译器实现相关,一般满足以下三个准则:1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2)结构体毎个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internaladding);3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。说明:(1)这里所说的“数据宽度”就是指其sizeof的大小。由于结构体的成员可以是复合类型,比如另外一个结构体
4、,所以在寻找最宽基本类型成员时,废当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置吋则是将复合类型作为整体看待。(2)有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6屮通过#pragmapack实现,也可以直接修改/Zp编译开关。#pragmapack的基本用法为:^pragmapack(n),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以
5、此值为准。(3)“空结构体”(不含数据成员)的大小不为0,而是1。1.sizeof联合体结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值=6osizeof类sizeof类和结构差不多,但要注意的是:1)没有虚函数:sizeof类的大小只针对数据成员而言2)有虚函数:sizeof类的大小针对数据成员和其中包含的虚表指针大小而言,在类中只包含一个虚表指针时和包含多个虚表指针时大小是不一样的,这应该高度重视。Sizeof与结构体的详细解释内存对齐,programonce
6、(n)及sizeof(结构体)由一道面试题开始展开:structNodel{doubleml;charm2;intm3;};typedefstruct{chara;intb;charc;}Node2;typedefstruct{chara;charb;intc;}Nodc3;在32位windows,VC6.0开发环境下,sizeof(Nodel)=?,sizeof(Node2)=?,sizeof(Node3)=?-一〉1)先说说理论的东西,再结合示例分析:一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平
7、台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。二、对齐规则每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。比如32位windows平台下,VC默认是按照8bytes对齐的(VC-〉Project->settings->c/c++-〉CodeGeneration中的tructmemberalignment值默认是8),程序
8、员可以通过预编译命令#pragmapack(n)n=l,2,4,8,16来改变这一系数,其屮的n就是你要指定的“对齐系数”。规则:1、数据成员对齐规则
此文档下载收益归作者所有