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

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

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

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

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

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
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33698185

复制
相关文章

相似问题

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