Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 源代码合并真的提高了C或C+的性能吗+;节目?_C++_C_Gcc_Compiler Optimization - Fatal编程技术网

C++ 源代码合并真的提高了C或C+的性能吗+;节目?

C++ 源代码合并真的提高了C或C+的性能吗+;节目?,c++,c,gcc,compiler-optimization,C++,C,Gcc,Compiler Optimization,代码合并是将整个源代码复制到一个文件中 例如,它是通过减少编译时间和提高生成的可执行文件的性能来完成的。在这里,它产生了一个包含184K行代码的文件 我的问题不是关于编译时间(已经在中回答过),而是关于可执行文件的效率 SQLite开发人员说: 除了使SQLite更容易合并到其他项目中之外,合并还使它运行得更快。当代码包含在单个翻译单元(如合并单元)中时,许多编译器能够对代码进行额外的优化。当我们使用合并来编译SQLite而不是单个源文件时,我们已经测量到性能提高了5%到10%。这样做的缺点是,

代码合并是将整个源代码复制到一个文件中

例如,它是通过减少编译时间和提高生成的可执行文件的性能来完成的。在这里,它产生了一个包含184K行代码的文件

我的问题不是关于编译时间(已经在中回答过),而是关于可执行文件的效率

SQLite开发人员说:

除了使SQLite更容易合并到其他项目中之外,合并还使它运行得更快。当代码包含在单个翻译单元(如合并单元)中时,许多编译器能够对代码进行额外的优化。当我们使用合并来编译SQLite而不是单个源文件时,我们已经测量到性能提高了5%到10%。这样做的缺点是,额外的优化通常采用函数内联的形式,这往往会使生成的二进制图像的大小变大

据我所知,这是由于编译器进行了优化

开发者也这样说(感谢@nwp的链接):

编译器根据对程序的了解执行优化。一次将多个文件编译为单个输出文件模式允许编译器在编译每个文件时使用从所有文件获得的信息

但他们并没有谈论最终的收益

除了SQLite之外,是否有任何测量结果证实或驳斥了使用gcc编译时,使用合并的IPO比不使用合并的IPO生成更快的可执行文件的说法


作为一个附带问题,对于这种优化,进行代码合并还是将所有.cpp(或.c)文件包含到一个文件中是同一件事?

源代码文件的组织将不会“产生更高效的二进制文件”,并且从多个源文件检索的速度可以忽略不计

版本控制系统将接受任何文件的增量,而不管其大小

通常,像这样的独立组件会被单独编译,以生成包含相关目标代码的二进制库:源代码不会每次重新编译。当“应用程序A”使用已更改的“库B”时,必须重新链接“应用程序A”,但如果库的API未更改,则不必重新编译

而且,就库本身而言,如果它由(数百)个独立的源文件组成,则在重新链接库之前,只需重新编译已更改的文件。(任何
Makefile
都可以这样做。)如果源代码是“一件大事”,那么每次都必须重新编译所有代码,这可能需要很长时间。。。基本上,这是浪费时间

有两种方法可以将库中的目标代码(构建完成后…)合并到可执行文件中:静态链接和动态链接。如果使用静态链接,库的必要部分将复制到可执行文件中。。。但是,不是全部。运行可执行文件时,库文件不必存在

如果使用动态链接,则整个库存在于一个单独的文件(例如
.DLL
.so
)中,该文件在运行时必须存在,但将由同时使用它的每个应用程序共享


我建议您主要将其视为源代码管理问题,而不是将其视为具有任何技术或运行时优势的问题。(不会的。)我发现很难找到一个令人信服的理由来这样做。

哦,这是一个讨论式的问题。它不适合这个网站。编译速度的优势是可疑的,因为你不能做增量构建。如果工具链允许良好的链接时间优化,那么编译的结果也不必明显更好。@Olaf“C/C++”的意思是“C或C++语言”,而不是“C/C++语言”。根据你的说法,哪一个网站更适合这些问题?由于已经有相关的问题,我认为这是一个好网站。你提到的缺点也适用于多文件源分发(A必须重新编译+发布以合并新版本的B)。作为一个“A”应用程序创建者,您通常无法控制部署环境,因此您要么生产一个非常聪明的安装程序来处理依赖项并根据需要安装额外的软件(linux软件包管理器,如Debian上的
dpkg
),要么您必须将所有内容与“A”一起分发。编译时依赖项和捆绑依赖项之间的区别在于,通过安装第一个依赖项,可以减少主机污染和冲突风险。@Olaf我认为这个问题不是“主要基于观点”。我编辑了我的问题以更好地反映这一点。我正在寻找关于假定性能改进的事实,以及软件工程问题的最终解决方案。你能重新打开它吗?我不同意可以忽略不计的运行时优势。有很多C编译器不支持LTO。通过在一个文件中编译所有代码,这些编译器可以实现未使用的函数、内联函数和其他优化。但是,如果每个应用程序都有自己的库源代码副本,那么它们都有自己的
*。那么
文件,不是吗?因此,这样的做法消除了动态库的一个优点。还要记住,源文件(大或小)与其他文件不同步的风险很大。哎呀,源代码更改并没有应用到那个庞大的源文件的每个副本上。你明白了。。。就像我说的,“源代码管理问题”。静态库非常好,包括“从安全角度来看”,因为