c++ - 将代码编译为单个自动合并文件,以允许编译器更好地优化代码

标签 c++ c optimization compilation

假设您有一个 C、C++ 或任何其他采用“编译对象然后链接它们”方案的语言的程序。

当您的程序不小时,可能会破坏多个文件,以简化代码管理(并缩短编译时间)。此外,经过一定程度的抽象后,您可能会拥有很深的调用层次结构。尤其是在任务最重复的最低级别,您最常想强加一个通用框架。

但是,如果您将代码分成不同的目标文件并为您的代码使用非常抽象的架构,则可能会影响性能(如果您或您的主管强调性能,这会很糟糕)。

避免这种情况的一种方法可能是广泛内联——这是模板元编程的方法:在每个翻译单元中,您都包含通用、灵活结构的所有代码,并依靠编译器来解决性能问题。我想在没有模板的情况下做类似的事情 - 比如说,因为它们太难处理或者因为你使用纯 C。

您可以将所有代码写入一个文件。那太可怕了。编写一个将所有代码合并到一个源文件中并进行编译的脚本怎么样?要求你的源文件不要写得太乱。然后编译器可能会应用更多的优化(内联、死代码消除、编译时算法等)。

你对这种“把戏”有过体会或反对吗?

最佳答案

对于现代编译器毫无意义。 MSVC、GCC 和 clang 都支持链接时代码生成(GCC 和 clang 将其称为“链接时优化”),这恰恰允许这样做。此外,将多个翻译单元组合成一个大单元会使您无法并行化编译过程,并且(至少在 C++ 的情况下)会使 RAM 使用率飙升。

in each translation unit you include all the code of your general, flexible structures, and count on the compiler to counteract performance issues.

这不是一项功能,与性能没有任何关系。这是编译器和包含系统的恼人限制。

关于c++ - 将代码编译为单个自动合并文件,以允许编译器更好地优化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362994/

相关文章:

c++ - 自定义控件上的文本

c++ - 参数为 "-S -save-temps"的 gcc 将中间文件放在当前目录中

c++ - 纹理和纹理映射 GLUTess 多边形?

c++ - 比较二次函数的根

c++ - 将文件读入结构时大小增加 10 倍

c++ - 将 QClipboard 传递给 QML

c++ - 连接到 IP 地址而不是本地主机?

c - 我的 chdir() 函数将不起作用。为什么?

java - 优化基于网格的粒子系统

c++ - 你有在圆上应用函数的技巧吗?