【问题标题】:calling sizeof on a function call skips actually calling the function!}在函数调用上调用 sizeof 会跳过实际调用函数!}
【发布时间】:2012-04-26 06:54:02
【问题描述】:

我偶然发现了这段代码。

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/文件等)的函数是不是不正确?

【问题讨论】:

  • 代码不调用函数——它甚至不操作指向函数的指针。

标签: c++ sizeof


【解决方案1】:

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

【讨论】:

  • 谢谢!但是我们可以看到 x() 具有打印到 IO 流的副作用。编译时只知道sizeof的值,不调用函数不是错吗?
  • @ChethanRavindranath:函数的作用无关紧要。 sizeof 专门设计用于避免表达式可能具有的任何和所有副作用。
  • 更重要的是,语言标准明确规定sizeof 的操作数是评估的。 (这在某些元编程技术中非常重要,其中“被调用”函数甚至不存在。)
【解决方案2】:

sizeof 实际上是一个运算符,它是在编译时计算的。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多