包括每个标题是否有任何性能影响?

Mar*_*cký 16 c c++ header-files

让我们说我想使用hex()功能.我知道它在<ios>头文件中定义,我也知道它包含在<iostream>头文件中.不同之处在于<iostream>更多功能和其他我不需要的东西.

从性能角度来看,我是否应该关注包含/定义更少的功能,类等等?

Gal*_*lik 31

如果标准说它在标题中定义,<ios>则包括标题,<ios>因为您不能保证它将包含在/通过任何其他标题.

  • @black - 你可以依赖标题中定义的标题所定义的符号.很少需要出现在多个标题中.大多数实现最终在多个头中定义了一些符号,因为它们是内部需要的,但这是特定于实现的,即不是你可以依赖的东西. (5认同)
  • 问题中的任何内容是否与需要相矛盾或有疑问? (2认同)

Ano*_*ail 27

  • 没有运行时性能损失.
  • 但是,如果包含大量不必要的标头,则可能会有过多的编译时间.
  • 此外,完成此操作后,您可以创建不必要的重新编译,例如,如果更改了标头但是不使用它的文件包含它.

在小项目中(包括小标题),这无关紧要.随着项目的增长,它可能会.


Ded*_*tor 5

TL; DR:一般来说,最好只包括你需要的东西.包括更可以对二进制文件的大小和启动(应该是微不足道的)产生不利影响,但主要是伤害编译时不预编译头.


好吧,当然你必须至少包括那些保证涵盖你所有用途的标题.
有时候它可能会"工作",因为标准的C++头文件都允许在实现者想要的时候互相包含,并且允许头文件在std-namespace中包含其他符号(参见为什么"using namespace std")被认为是不好的做法?).

接下来,有时包括一个额外的标题可能会导致创建其他对象(请参阅参考资料std::ios_base::Init),尽管精心设计的库可以最大限度地减少这种情况(据我所知,这是标准库中唯一的实例).

但是,最大的问题实际上并不是编译(和优化)二进制文件的大小和效率(除了前一点,它的影响应该是微不足道的,应该不受影响),但是在积极开发的同时编译时间(参见如何做) #include <bits/stdc ++.h>在C++中工作?).
后者是(严重的,以至于委员会正在研究模块提案,请参阅C++模块 - 为什么它们会从C++ 0x中删除?它们会在以后再回来吗?)因添加多余的标头而受到不利影响.

当然,除非您正在使用预编译头文件(请参阅为什么使用预编译头文件(C/C++)?),在这种情况下,在预编译头文件中包含更多内容,因此在所有地方而不是仅在需要的地方包含更多内容,只要这些头文件未被修改,实际上大多数时候会减少编译时间.

有一个基于铿锵声的工具,用于找出最小的标题,称为include-what-you-use.
它分析了clang AST来决定,这既是一个优点也是一个弱点:
你不需要教一个标题所提供的所有符号,但它也不知道事情是否就是这样的.该修订,或它们是否合同.
所以你需要仔细检查它的结果.