如何理解C++中的sizeof.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如何理解C中的sizeof

C++中的尺寸 1. sizeof:返回类型的尺寸 每个类型在编译时都会决定自己的实例需要多少字节。在编译后,该类型的所 有对象占有的空间是一样的,不会发生变化。因此,我们可以用sizeof 来计算 一个类型或者该类型的某个实例来得到尺寸信息。下面的代码是等价的 int iVal; //sizeof type sizeof(int) //sizeof instance sizeof(iVal) 无论我们用iVal 还是int,上面的表达式都会返回int 类型的尺寸(当然如前 所说,iVal 的尺寸和其类型尺寸永远是一样的)。 不熟悉sizeof 的朋友往往会在处理指针时弄错概念。考虑下面代码: int iArray[10]; int sizeofArray=sizeof(iArray); int * p= new int[10]; int sizeofPointer = sizeof(p); 在很多人心目中,指针和数组是等价的,但是事实严格起来并不如此。上面的代 码就会返回不同的结果。 对于iArray,它的类型是int[10],是一个数组,sizeof 计算其尺寸时,知道 它包含10 个元素,每个元素都时个整型,因此返回40。而对于p,它的类型是 int*,指针的尺寸永远是4,因此结果就是4。sizeof 不会也不可能知道p 实际 指向10 个元素的数组。 出现这个问题的原因有两个:1. sizeof 是在编译时计算的,而new int[10]指 向的数组是在运行时创建的,也就是说当sizeof(p)计算时,系统还不知道p 会 指向多少个int 元素,自然也不可能知道它指向的数组占有多少字节。2. sizeof 计算的是p 自己的类型所占据的空间,而不是p 指向的对象所占据的空间,可以 说,p 自己占据4 个字节,而p 指向的空间占40 字节。 在这种概念下,我们是不是可以通过sizeof(*p)来得到40 呢?很不幸,不行, 原因是p 的类型是int*,*p 的类型是int,因此无法得到其是一个数组的事实。 实际上,这个尺寸信息是个运行时数据,作为C/C++语言而言,是无从知道这个 信息的(因为C/C++指针不包含这种信息),要得到它,唯一的办法是指望操作 系统在运行时中提供。在VC 中,我们可以通过_msize 得到。 2. 对齐问题 我们在访问内存时,如果地址是按4 字节对齐,则访问效率会高很多。这个问题 的原因在于访问内存的硬件电路。一般情况下,地址总线总是按照对齐后的地址 来访问。例如你想得到0开始的4 字节内容,系统首先需要以 0读4 字节,然后从中取得3 字节,然后在用0作为开始地 址,获得下一个四字节,在从中得到第一个字节,两次组合出你想得到的内容。 但是如果地址一开始就是对齐到0则系统只要一次读写即可。 为了性能考虑,编译器会对结构进行对齐处理。考虑下面的结构 struct aStruct { char cValue; int iValue; }; 直观的讲,这个结构的尺寸是sizeof(char)+sizeof(int)=5,但是在实际编译 下,这个结构尺寸缺省是8,因为第二个域ivalue 会被对齐到第四个字节。 在VC 中,我们可以用pack 预处理指令来禁止对齐调整。例如,下面代码将使得 结构尺寸更加紧凑,不会出现对齐到4 字节问题: #pragma pack(1) struct aStruct{ char cValue; int iValue; }; #pragma pack() 对于这个pack 指令的含义,大家可以查询MSDN。请注意:除非你觉得必须这样, 不要轻易做这样的调整,因为这将降低程序性能。目前比较常见的用法是:1. 这 个结构需要被直接写入文件 2. 这个结构需要通过网络传给其他程序。 注意:字节对齐是编译时决定的,一旦决定不会再改变,因此即使有对齐的因素 在,也不会出现一个结构在运行时尺寸发生变化的情况出现。

文档评论(0)

jiupshaieuk12 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档