RVO和复制省略只能在一个编译单元内工作吗?

时间:2014-05-21 08:28:17

标签: c++ copy-elision rvo

它们是否适用于不同的目标文件? 它们是否适用于不同的DLL?

我知道这取决于编译器。我很好奇是否有任何编译器和优化设置可以使这项工作。

1 个答案:

答案 0 :(得分:2)

通常,是的,但原则上,使用链接时优化(-flto用于GCC / Clang编译器和链接器)或链接时代码生成(/LTCG和{{1}对于MSVC的编译器和链接器),编译器和链接器可以利用它们的共享知识以及内联代码和elide副本。海湾合作委员会的manual州:

  

[...]这会导致GCC中的所有过程间分析和优化在两个文件中一起工作,就像它们是单个文件一样。这意味着,例如,内联器能够将bar.o中的函数内联到foo.o中的函数中,反之亦然。

注意这不适用于DLL,因为共享库的代码是固定的并且已经完全编译。

RVO只需要有关函数本身的信息(因为它就地构造了函数的返回值而不是复制/移动/GL。这可能会在没有aboce选项的情况下工作。