编译器是否优化了值传递的函数参数?

Nav*_*een 19 c++ compiler-construction optimization

假设我有一个函数,其中参数通过值而不是const-reference传递.此外,假设在函数内部仅使用该值,即函数不会尝试修改它.在这种情况下,编译器是否能够确定它可以通过const-reference传递值(出于性能原因)并相应地生成代码?是否有任何编译器可以做到这一点?

Joh*_*itb 14

如果传递变量而不是临时变量,则如果复制构造函数执行了运行程序时会发现的任何内容("可观察行为":输入/输出或更改volatile变量),则不允许编译器优化掉副本. .

除此之外,编译器可以自由地执行它想要的任何事情(它只需要像可观察的行为一样 - 如果它根本没有优化的话).

仅当参数是rvalue(大多数临时)时,即使复制构造函数具有可观察的副作用,也允许编译器将副本优化为by-value参数.

  • 如果您从右值复制,则免除@sbi复制.如果从左值复制,则不是.如果你传递一个rvalue并且编译器内联被调用函数的代码,它可以优化它想要的任何东西(事实上,我已经看到GCC优化了数百条装配线,其中三个或四个嵌套调用只需要两三行) .请参阅C++ 03规范中的12.8/15. (2认同)
  • @David,标准明确指出,即使复制构造函数具有可观察的行为,也可以省略副本.第15段读作"当满足某些标准时,允许实现省略类对象的复制结构,即使该对象的复制构造函数和/或析构函数具有副作用." 这就是为什么你可以将print语句放入复制构造函数中并注意它何时执行以及何时不复制. (2认同)

ken*_*ytm 7

只有在未导出函数的情况下,编译器才有可能将call-by-reference转换为call-by-value(或反之亦然).

否则,由于调用约定,函数必须保持call-by-value/reference语义.

  • 但内联的内容副本当然可以进行优化,即使外部可见的功能版本不是. (2认同)