7

我碰巧偶然发现了这段代码。

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/文件等)的功能不是不正确吗?

4

5 回答 5

15

sizeof是编译时运算符,并且从不计算操作数。

于 2012-04-26T06:56:11.900 回答
4

sizeof实际上是一个运算符,它在编译时进行评估。

编译器可以评估它,因为返回类型的大小x是固定的;它在程序执行期间不能改变。

于 2012-04-26T06:56:02.233 回答
2

sizeof()给出数据类型的大小。在您的情况下,它不需要调用函数来获取数据类型。

我怀疑 sizeof 也在编译时而不是运行时做它的业务......

于 2012-04-26T06:59:35.337 回答
2

让我引用 c++03 标准,#5.3.3。

sizeof 运算符产生其操作数的对象表示中的字节数。操作数要么是一个未计算的表达式,要么是 一个带括号的类型 ID。

于 2012-04-26T07:00:24.200 回答
2

sizeof 的结果是在 C++ 的编译时间内计算的。所以有对 x(20) 的函数调用

于 2012-04-26T06:56:15.603 回答