我知道到目前为止,多个文件将使代码更容易。但是,它们是否会在“将其全部塞入一个文件”之间提供性能差异,或者像 gcc 这样的现代编译器是否会为两者创建相同的二进制文件。当我说性能差异时,我指的是文件大小、编译时间和运行时间。
这仅适用于 C。
可以说,多个文件的编译时间会有所改善,因为您只需要重新编译已更改的文件(假设您有一个不错的依赖关系跟踪构建系统)。
链接可能需要更长的时间,因为还有更多工作要做。
传统上,编译器无法跨多个源文件执行优化(内联函数之类的事情很棘手)。因此,生成的可执行文件可能会有所不同,并且可能会更慢。
当一切都在一个文件中时,有更多的优化机会。例如,gcc,-O2
如果它们的主体可用,则将内联一些函数,即使它们没有被声明为内联(甚至更多的函数有资格内联-O3
)。因此运行时间存在差异,有时您甚至有机会注意到它们。更是如此-fwhole-program
,告诉 GCC 你不关心外部函数的离线版本,除了main()
(GCC 表现得好像你的所有外部函数都变成了静态的)。
总体编译时间可能会增加(因为要分析的内容更多,并且并非所有优化器算法都是线性的)或减少(当不需要多次解析相同的标头时)。二进制大小可能会增加(由于内联,以换取运行速度更快)或减少(不太可能;但有时,内联将调用者的代码简化到代码大小减小的程度)。
为了便于开发和维护,你可以使用 sqlite 的方法:它有多个源文件,但在编译之前它们被挤成一个(“合并”)。
从一些测试来看,编译和链接需要更长的时间。您将收到一个不同的二进制文件,至少我收到了,但是我的二进制文件在另一个字节之内。
.000764 MS
在运行的多文件版本中运行的多合一文件.000769 MS
一定要对基准测试持保留态度,因为我确实在大约 5 分钟内将它放在一起,而且它是一个小程序。
所以总体上真的没有区别。