【问题标题】:Does including unused headers have impact on cpp compile time?包含未使用的标头是否会影响 cpp 编译时间?
【发布时间】:2022-07-17 05:36:25
【问题描述】:

我正在开发一个包含许多 .cpp 和 .h 文件的 cpp 项目。 我一直在努力改善它缓慢的编译时间,发现项目中的 cpp 文件包含许多实际上在代码中没有使用的不必要的头文件。

这会降低 cpp 编译时间吗?

我认为它可以,但我想确切地知道它为什么会影响 cpp 编译时间,以及理论上会影响多少。

【问题讨论】:

  • 这是必然的,尽管预编译的头文件可以提供帮助。当您通过代码库工作时,我会一次取出一个 .cpp 文件。最初将它们注释掉,找出有效的和无效的,然后在继续之前删除不需要的。
  • “为什么会影响 cpp 编译时间”——因为这些文件中的文本至少需要进行预处理和解析。它对编译时间有多大影响?你为什么不试试呢?我刚刚创建了一个简单的源文件,它的编译时间比它为空时要长 25 倍。
  • @DanielLangr 天哪!太好了,麻烦您测试一下。
  • @DanielLangr 感谢您的提示。对于您的问题,由于我正在处理的项目有数千个文件,所以我想在尝试使用项目之前知道理论数字。
  • @Lani:没有理论,因此没有理论数字。这就是为什么 Daniel Langr 做了明智的事情,并且只是在实践中进行了测试——在他的系统上。当然,使用空文件作为基线意味着编译时间本质上只是启动编译器本身。

标签: c++ compilation header-files


【解决方案1】:

#include-ing 不需要的库会大大减慢编译时间。

您可以通过一个简单的实验来了解为什么这是正确的。对比这段代码的编译时间...

// no includes here!
int main() { return 0; }

...到此代码(我从找到的列表中剪切/粘贴了几十个 #includes)...

// <dozens of useless #includes here>
int main() { return 0; }

...想想当你编译它们时会发生什么。我定时编译每个,这就是我所看到的:

$$ time g++ no_includes.cpp -o no_includes     
g++ no_includes.cpp -o no_includes  0.04s user 0.02s system 95% cpu 0.061 total
$$ time g++ all_the_includes.cpp -o all_the_includes     
g++ all_the_includes.cpp -o all_the_includes  0.50s user 0.04s system 99% cpu 0.541 total

半秒的等待时间不是很长,但仍然比需要的时间长 10 倍。额外的时间主要是预处理器需要用相应库的副本替换每个#include 的时间。如果第二个程序中的 main() 确实调用了 STL 函数,编译器将需要更多时间来搜索所有库以查找匹配的名称,找出其中哪些 STL 函数是可行的候选者,然后选择最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多