在系统头中包含保护并影响编译速度

时间:2015-07-03 17:30:30

标签: c++ c gcc include precompiled-headers

我目前正在加速编译一个大型C ++项目(也有一些C代码)。最初我是

  • 删除不必要的系统包括;和
  • 为常见系统引入预编译标头包括stddef.hvector。但不适用于不应常用的stdio.hiostream等内容。

我认为系统标题会包含警戒,因此会被gcc的multiple include optimization覆盖。但是,似乎并非所有标题都遵循此准则。例如,stdlib.h在开始时有#ifndef STDLIB_Hstddef.h遵循相同的模式。但是assert.h没有标准的包含保护,cstddefcstdlib也没有。

我一直在使用gcc中的-H选项跟踪并随后分析此项目中的包含依赖项。我观察到的是,对于只有6个文件的小子项目,stdlib.hstddef.h,它们遵循包含警戒模式,在输出中显示6次,而不是不会出现10或100次。我有点担心,由于其中一些文件可能位于远程网络驱动器上,因此编译速度可能较慢。

当我最初在项目中使用预编译的头文件时,只包含vector等C ++头文件,以及某些内部库中的头文件时,我有点惊讶的是只能获得20%的性能提升。当我在Visual C ++中做类似的事情时,我看到了更大的增长。 (可能相关GCC build time doesn't benefit much from precompiled headers。)

我对gcc比较陌生,所以我可能错过了一些东西。我的问题是:

  • 为什么有些标题包含标准包含警戒,有些标题没有?
  • 我应该关注编译速度的影响吗?
  • 如果是这样,如何解决?我不介意将assert添加到预编译的标头中,但我不想添加cstdlib,例如。

0 个答案:

没有答案