它们是否适用于不同的目标文件?它们是否跨不同的 DLL 工作?
我知道这取决于编译器。我很好奇是否有任何编译器和优化设置可以使这项工作。
通常,是的,但原则上,使用 Link-Time-Optimization(-flto
对于 GCC/Clang 编译器和链接器)或 Link-Time-Code-Generation(对于 MSVC 的编译器和链接器),编译器和链接器可以利用他们的共享知识/LTCG
和/GL
也许是内联代码和省略副本。GCC 的手册指出:
[...] 这会导致 GCC 中的所有过程间分析和优化在这两个文件中工作,就好像它们是一个文件一样。这意味着,例如,内联器能够将 bar.o 中的函数内联到 foo.o 中的函数中,反之亦然。
请注意,这不适用于 DLL,因为共享库的代码是固定的并且已经完全编译。
RVO 只需要有关函数本身的信息(因为它就地构造函数的返回值而不是复制/移动return
. 这很可能在没有 aboce 选项的情况下工作。