我遇到了一个似乎与 g++ 相关的问题。基本上,当一个程序被分割成多个文件时,g++ 需要更多的时间来编译它而不是一个单一的整体文件。事实上,如果你将单个文件放在一起并编译,它的运行速度比在 g++ 命令行上列出单个文件要快得多。例如,有九个文件,编译需要1分39秒;当我把它们放在一起时,编译只需要 13 秒。我试过使用,strace但它只是卡在cc1plus;当我使用该-f选项时,我仍然无法找出导致问题的原因。
我已经隔离了问题。这是重现它的方法。我写了一个非常简单的程序,像这样:
void func_01(int i)
{
int j;
volatile int *jp;
jp = &j;
for (; i; i--) ++*jp;
}
void call_01(void)
{
func_01(10000);
}
int main(int argc, char *argv[])
{
call_01();
}
Run Code Online (Sandbox Code Playgroud)
然后我复制了它,删除了主要的并用递增的数字代替了 999 次。然后我建立了:
% time g++ -c test*.cpp
real 0m18.919s
user 0m10.208s
sys 0m5.595s
% cat test*.cpp > mon.cpp
% time g++ -c mon.cpp
real 0m0.824s
user 0m0.776s
sys 0m0.040s
Run Code Online (Sandbox Code Playgroud)
因为我打算扩展到比这复杂得多的数百个文件,所以缩短构建时间很重要。任何人都可以帮助解释为什么会发生这种情况,或者提供一个不那么粗暴的解决方法吗?我认为这在一定程度上与预处理器和包含保护带来的节省有关,因为即使我包含一个文件,时差也会显着增加(在一种情况下是五倍),但它仍然存在,没有包含,使用整体文件的速度提高了 20 倍。
g++ …
我编译了这样的代码来启用Asan:
g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer
Run Code Online (Sandbox Code Playgroud)
但它永远不会生成核心转储,以便我以后可以检查错误的详细信息.我该如何生成它?