关于C ++中sizeof运算符的功效

时间:2011-02-26 11:04:49

标签: c++ sizeof

我正在阅读Modern C ++设计。关于操作者的尺寸如下所述被提及。以下段落是从通用编程的角度解释的。

  

sizeof中有惊人的功率:你可以将sizeof应用于任何表达式,无论多么复杂,sizeof返回其大小而不在运行时实际评估该表达式。这意味着sizeof知道重载,模板实例化,转换规则 - 可以参与C ++表达式的所有内容。实际上,sizeof隐藏了一个完整的工具来推断表达的类型;最终,sizeof抛弃表达式并仅返回其结果的大小。

我的问题是作者的意思是sizeof返回其大小而不是在运行时实际评估exression。并且在最后一行中提到了sizeof抛弃了表达式。请求帮助理解这些语句,如果用示例完成它将会很好。

由于

5 个答案:

答案 0 :(得分:2)

编译时评估

sizeof编译器计算 sizeof运算符后面的表达式的类型。这是由编译器一次性完成所有,因此句子“没有在运行时实际评估该表达式”

编译器计算类型,然后它能够​​从类型推断表达式的大小,然后仍然在编译时,整个{{ 1}}表达式由计算的大小替换。因此表达式本身并没有将它变成可执行代码。这就是句子“sizeof抛弃表达式并仅返回其结果的大小”的意思。

答案 1 :(得分:2)

  

作者的意思是sizeof返回其大小而不是在运行时实际评估exression。

这意味着sizeof(1/0)将产生sizeof(int),即使1/0通常会中止该程序,因为除以零是运行时错误。此外,对于声明为p的任何T* psizeof(*p)无论sizeof(T)中存储的值是什么,都会产生p,即使p是悬空或根本没有初始化。

答案 2 :(得分:1)

下面给出了i++所具有的类型的sizeof,即int(通常int有4或8个字节,所以它可能会给你4或8的值)。但是,由于未计算表达式,因此不对表达式执行运行时操作。

int i = 0;
sizeof(i++);

评估表达式基本上意味着执行其副作用(例如递增变量)或在运行时从内存或寄存器读取值。所以在某种意义上sizeof“抛弃”它的操作数,因为它并没有真正执行它指定的运行时操作(i的值仍然为零)。

答案 3 :(得分:0)

编译器需要计算各种操作的类型/结构/类的大小。 sizeof运算符将这些大小作为常量提供给您的程序。因此,例如,如果执行sizeof(int),编译器会知道int有多大(以字节为单位),而是会插入该值。这同样适用于更复杂的事情,例如sizeof(myVariable) myVariable类型为MyClass:编译器确实知道MyClass占用了多少空间,因此可以插入该值。< / p>

重点是此评估在编译时进行:结果是一个数字。在运行期间,不需要再次进行评估。

答案 4 :(得分:-1)

这意味着int j=sizeof(int);将被编译为int j=4;

我已阅读已编译的程序集,执行期间实际上没有计算!