当我尝试编译两个包含一些需要针对速度进行高度优化的重要计算算法的源文件时,我遇到了一个奇怪的问题。
最初,我有两个源文件,我们称之为A.c
和B.c
,每个文件都包含多个相互调用的函数(来自文件的函数)可以调用其他文件中的函数)。我使用全速优化编译这两个文件,然后当我在应用程序中运行主算法时,运行 900 ms 。
然后我注意到两个文件中的函数从逻辑的角度来看是混淆的,所以我将一些函数从A.c
移到B.c
;让我们调用新文件A2.c
和B2.c
。我还通过移动相应的声明更新了两个标题A.h
和B.h
。
将函数定义从一个文件移动到另一个文件是我做的唯一修改!
奇怪的结果是,在我使用相同的优化再次编译这两个文件后,算法现在需要 1000 ms 才能运行。
这里发生了什么?
我怀疑发生了什么:当函数f
调用函数g
时,在同一个文件中允许编译器用内联代码替换实际函数调用作为优化。如果不同时编译定义,则不再可能这样做。
答案 0 :(得分:3)
至于您的假设是否正确,最好的方法是检查汇编程序输出,例如使用gcc -S
或gcc -save-temps
。 那将是查看编译器所做的最终方式。
至于将两个C源文件编译成单个目标文件,当然可行。只需创建一个AB.c
,如下所示:
#include "A.c"
#include "B.c"
并编译。
除非应该保持分开(例如两个C文件中可能存在的静态项),这应该有用(或者至少可以进行一些修改)。
然而,请记住优化口号:测量,不要猜测!您通过组合它们放弃了相当多的封装,因此请确保好处远远超过成本