我正在阅读Modern C ++设计。关于操作者的尺寸如下所述被提及。以下段落是从通用编程的角度解释的。
sizeof中有惊人的功率:你可以将sizeof应用于任何表达式,无论多么复杂,sizeof返回其大小而不在运行时实际评估该表达式。这意味着sizeof知道重载,模板实例化,转换规则 - 可以参与C ++表达式的所有内容。实际上,sizeof隐藏了一个完整的工具来推断表达的类型;最终,sizeof抛弃表达式并仅返回其结果的大小。
我的问题是作者的意思是sizeof返回其大小而不是在运行时实际评估exression。并且在最后一行中提到了sizeof抛弃了表达式。请求帮助理解这些语句,如果用示例完成它将会很好。
由于
答案 0 :(得分:2)
sizeof
:编译器计算 sizeof
运算符后面的表达式的类型。这是由编译器一次性完成所有,因此句子“没有在运行时实际评估该表达式”。
编译器计算类型,然后它能够从类型推断表达式的大小,然后仍然在编译时,整个{{ 1}}表达式由计算的大小替换。因此表达式本身并没有将它变成可执行代码。这就是句子“sizeof抛弃表达式并仅返回其结果的大小”的意思。
答案 1 :(得分:2)
作者的意思是sizeof返回其大小而不是在运行时实际评估exression。
这意味着sizeof(1/0)
将产生sizeof(int)
,即使1/0
通常会中止该程序,因为除以零是运行时错误。此外,对于声明为p
的任何T* p
,sizeof(*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;
我已阅读已编译的程序集,执行期间实际上没有计算!