首页 > 解决方案 > 将多个文件传递给 C/C++ 编译器是否允许过程间优化?

问题描述

假设我有foo.cpp以下内容

int foo() {
  return 123;
}

我在其中main.cpp使用foo

int main() {
  int r = foo();
  return r;
}

我可以将两个源文件编译成目标代码,然后使用链接时优化将它们链接起来,使foo()调用内联到main().

但是我可以通过在编译器命令行中列出这两个文件来达到同样的效果c++ foo.cpp main.cpp吗?或者它只是归结为

foreach(file in files)
  UsualCompilingRoutinesForSingleFile(file)

?

如果是,为什么不允许编译器将传入的所有文件连接到一个文件中以实现某种 LTO?

标签: c++gccclang

解决方案


由于本地/静态对象,连接文件并不相同。您可能会有冲突(想想未命名的命名空间)。例如,第一个文件使用一个foo在静态映射中查找的本地函数,然后第二个文件有另一个foo在哈希映射中查找的本地函数(无论出于何种原因,是的,我同意这也是一个糟糕的设计) .

如果您将两个文件编译在一起,将它们连接起来,那么您会破坏翻译单元的封装,并且您会获得相同文件的多个定义。

在您的示例中,编译器将两个文件分开并将链接编译在一起,它不是 LTO,而是其他东西(不仅生成目标文件,而且是一种可以与其他文件合并然后优化的 AST)。


推荐阅读