如何检查返回值优化是否发生?

时间:2017-08-18 21:21:16

标签: c++ gcc g++

考虑这个功能:

std::string 
myClass::myFunction2() {
  std::string result = myClass::myFunction1();
  return result;
}

我希望编译执行return value optimization。如何确保实际发生这种情况,代码不会冗余地复制结果?

1 个答案:

答案 0 :(得分:4)

如果可能,RVO 始终。对于您的情况,假设myFunction1()根据执行路径不返回不同的命名对象,编译器应执行RVO。如果它返回具有不同执行路径的不同命名对象,则编译器无法执行优化。

我建议你做自己的实验:

要在任何地方停用优化,请使用 pragma

#pragma GCC push_options
#pragma GCC optimize (ARG)

//your code

#pragma GCC pop_options

要停用特定功能的优化,请使用 __ attribute __(())

void __attribute__((optimize(ARG))) foo(unsigned char data) {
    // your code
}

ARG 可以是数字(即优化级别)或以0开头的字符串(即优化选项)等。根据需要,您可以用“O0”替换ARG然后运行使用 gcc -S 查看代码的两个版本以查看差异。我建议你阅读gcc 4.4或更新的文档。