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

Sar*_*ien 5 c++ copy-elision rvo

它们是否跨不同的目标文件工作?它们是否跨不同的DLL工作?

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

rub*_*nvb 3

通常是的,但原则上,使用链接时间优化(-flto对于 GCC/Clang 编译器和链接器)或链接时间代码生成(/LTCG对于/GLMSVC 的编译器和链接器),编译器和链接器可以利用它们共享的知识和也许是内联代码和删除副本。GCC 的手册指出:

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

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

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