我碰巧偶然发现了这段代码。
int x(int a){
std::cout<<a<<std::endl;
return a + 1;
}
int main()
{
std::cout<<sizeof(x(20))<<std::endl;
return 0;
}
我预计它会打印 20,然后是 4。但它只打印 4。为什么会这样?优化具有副作用(打印到 IO/文件等)的功能不是不正确吗?
sizeof
是编译时运算符,并且从不计算操作数。
sizeof
实际上是一个运算符,它在编译时进行评估。
编译器可以评估它,因为返回类型的大小x
是固定的;它在程序执行期间不能改变。
sizeof()
给出数据类型的大小。在您的情况下,它不需要调用函数来获取数据类型。
我怀疑 sizeof 也在编译时而不是运行时做它的业务......
让我引用 c++03 标准,#5.3.3。
sizeof 运算符产生其操作数的对象表示中的字节数。操作数要么是一个未计算的表达式,要么是 一个带括号的类型 ID。
sizeof 的结果是在 C++ 的编译时间内计算的。所以有对 x(20) 的函数调用