小编eew*_*nco的帖子

与使用 Google 模拟的单一文件相比,g++ 在多个文件上要慢得多

我遇到了一个似乎与 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++ …

c++ gcc

4
推荐指数
1
解决办法
394
查看次数

如何在AddressSanitizer错误上生成核心转储

我编译了这样的代码来启用Asan:

g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer
Run Code Online (Sandbox Code Playgroud)

但它永远不会生成核心转储,以便我以后可以检查错误的详细信息.我该如何生成它?

gcc sanitizer address-sanitizer

3
推荐指数
1
解决办法
2027
查看次数

标签 统计

gcc ×2

address-sanitizer ×1

c++ ×1

sanitizer ×1