让我说我想使用hex()函数。我知道它是在<ios>头中定义的,我也知道它包含在<iostream>头中。区别在于,在<iostream>中有更多的函数和其他我不需要的东西。
从性能角度来看,我应该关心的是包含/定义更少的函数、类等吗?
发布于 2015-11-13 18:11:48
TL;DR:一般来说,最好只包括你需要的。包含更多的内容可能会对二进制文件的大小和启动产生不利的影响(应该是微不足道的),但大多数情况下,没有预编译头的编译时间会受到影响。
当然,你必须至少把那些标题放在一起,保证涵盖你的所有用途。
无论如何,它有时可能会“工作”,因为标准的C++标头都可以按照实现者的要求相互包含,并且允许标头在std-namespace中包含其他符号(请参阅为什么“使用命名空间std”被认为是不好的做法?)。
接下来,有时包含额外的头可能会导致创建额外的对象(请参阅std::ios_base::Init),尽管精心设计的库会将这种情况最小化(据我所知,这是标准库中的唯一实例)。
但是,最大的问题并不是编译(和优化)二进制的大小和效率(除了前面的一点之外,它的效果应该很小),而是在积极开发时的编译时间(也请参阅How does #include work in C++?)。
而后者(非常严重,以至于委员会正在研究一个模块提案,参见C++模块--为什么从C++0x中删除它们?他们稍后会回来吗?)因增加多余的标头而受到不利影响。
当然,除非您使用的是预编译头(请参阅为什么使用预编译头(C/C++)?),在这种情况下,在预编译头中包含更多,因此在任何地方,而不是仅在需要的地方,只要不修改这些标头,实际上大多数情况下都会减少编译次数。
有一个基于clang的工具来找出最小的头,称为包括-你用什么?。
它分析clang AST以确定这是一个优点和一个弱点:
你不需要教它关于标题提供的所有符号,但它也不知道在修订中事情是这样的,或者它们是否是契约的。
所以你得再检查一遍结果。
https://stackoverflow.com/questions/33698185
复制相似问题