首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含每个标头有任何性能影响吗?

包含每个标头有任何性能影响吗?
EN

Stack Overflow用户
提问于 2015-11-13 17:08:56
回答 4查看 2.4K关注 0票数 17

让我说我想使用hex()函数。我知道它是在<ios>头中定义的,我也知道它包含在<iostream>头中。区别在于,在<iostream>中有更多的函数和其他我不需要的东西。

从性能角度来看,我应该关心的是包含/定义更少的函数、类等吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-13 17:10:25

  • 没有运行时性能的影响。
  • 但是,如果包含了大量不必要的头文件,那么编译时间可能会过长。
  • 此外,当这完成后,您可以创建不必要的重新编译,例如,如果一个头被更改,但一个文件不使用它包括它。

在小项目(包括小标题)中,这并不重要。随着项目的发展,它可能会。

票数 31
EN

Stack Overflow用户

发布于 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以确定这是一个优点和一个弱点:

你不需要教它关于标题提供的所有符号,但它也不知道在修订中事情是这样的,或者它们是否是契约的。

所以你得再检查一遍结果。

票数 5
EN

Stack Overflow用户

发布于 2015-11-13 17:47:03

包括不必要的头有下面的缺点。

  1. 更长的编译时间,链接器必须删除所有未使用的符号。
  2. 如果您在CPP中添加了额外的头,它只会影响您的代码。
  3. 但是,如果您将代码作为库分发,并且在头文件中添加了不必要的头文件。客户端代码将承担查找您使用过的标头的负担。
  4. 不要信任间接包含,使用实际定义所需函数的标头。
  5. 此外,在项目中,作为一种良好的编程实践,应该按照降低依赖性的顺序包括头。

//本地标头--最依赖于其他标头#包括//第三方库标头--适度依赖其他标头#include //标准C++标头--对其他头#的依赖最小

而不会受到影响的是运行时,链接器将在编译过程中清除未使用的符号。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33698185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档