c++ - 将多个文件传递给 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?
解决方案
由于本地/静态对象,连接文件并不相同。您可能会有冲突(想想未命名的命名空间)。例如,第一个文件使用一个foo
在静态映射中查找的本地函数,然后第二个文件有另一个foo
在哈希映射中查找的本地函数(无论出于何种原因,是的,我同意这也是一个糟糕的设计) .
如果您将两个文件编译在一起,将它们连接起来,那么您会破坏翻译单元的封装,并且您会获得相同文件的多个定义。
在您的示例中,编译器将两个文件分开并将链接编译在一起,它不是 LTO,而是其他东西(不仅生成目标文件,而且是一种可以与其他文件合并然后优化的 AST)。
推荐阅读
- docker - Docker 复制命令失败?
- python-3.x - 当我的脸移动得太快时,OpenCV 人脸检测会中断
- tomcat - Run Netty and tomcat on same port but different ip in a single server (Netty opens at localhost)
- python-3.x - 加速 Python 程序(自适应中值滤波器)
- typescript - 基于数组内容的条件类型/接口
- javascript - 如何在类组件中使用导航?反应原生
- ios - 在swiftui中按钮的触摸动作播放音频
- windows - 无法打开新的 Jupyter 笔记本 [权限被拒绝]
- c++ - 在 C++ 中使用嵌套 if 语句与逻辑运算符 &&
- matlab - 如何在高斯 3D 上绘制球体?