C++ sizeof使用规则及陷阱分析
1、什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:
在编译阶段已经被翻译为:
这里有个陷阱,看下面的程序:
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。 结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。 2、sizeof的用法 sizeof有两种用法: (1)sizeof(object) 也就是对对象使用sizeof,也可以写成sizeof object 的形式。 (2)sizeof(typename) 也就是对类型使用sizeof,注意这种情况下写成sizeof typename是非法的。下面举几个例子说明一下:
可以看出,加()是永远正确的选择。 结论:不论sizeof要对谁取值,最好都加上()。 3、数据类型的sizeof (1)C++固有数据类型 32位C++中的基本数据类型,也就char,short int(short),int,long int(long),float,double, long double 大小分别是:1,2,4,4,4,8, 10。 考虑下面的代码:
unsigned影响的只是最高位bit的意义,数据长度不会被改变的。 结论:unsigned不能影响sizeof的取值。 (2)自定义数据类型 typedef可以用来定义C++自定义类型。考虑下面的问题:
结论:自定义类型的sizeof取值等同于它的类型原形。 (3)函数类型 考虑下面的问题:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |