头文件包含和性能注意事项 c++
Posted
技术标签:
【中文标题】头文件包含和性能注意事项 c++【英文标题】:Header files inclusion and performance considerations c++ 【发布时间】:2013-08-23 16:03:49 【问题描述】:假设所有标头都正确设置了包含保护,是否有任何方法可以通过简单地更改这些标头来提高应用程序的运行时性能?
在一个文件中包含所有需要的标头的应用程序和没有的应用程序之间在性能方面有什么区别吗?
【问题讨论】:
拜托,拜托,为了软件开发的所有好处,不要到处认为完全不相关的随机更改会影响性能。让我把问题转过来:你认为为什么会这样? (我认为你回答这个问题会帮助你更多,因为它可以让我们消除你目前持有的任何误解) @R.MartinhoFernandes:我们生活在一个复杂的 CPU 架构的世界中,看似“不相关的随机变化”可能会影响性能。考虑更改调用堆栈中某处的局部变量导致堆栈以 8 字节对齐而不是 16 字节对齐的情况。与更改完全无关的 SSE 代码将受到影响。影响缓存性能的内存布局变化也可能导致“远距离操作”。 测试一下。通过将尽可能多的内容移到一个文件中来检查性能差异。 @Sebi:这就是为什么你需要对正在发生的事情有所了解......这个问题当然不需要。 【参考方案1】:运行时效率
包含或不包含的标头集实际上对生成的应用程序在运行时的效率没有影响。您应该包含声明您使用的函数的标题。例如,如果这些标头提供内联函数定义,那么与不提供内联函数声明的(假设的替代)标头相比,您可能会获得一些性能提升,但您仍然需要包含标头以便由人们控制提供标题。
编译时效率
我最初认为这就是您所追求的,部分原因是提到了标头包含保护,这是一个纯粹与编译相关的问题。
如果头文件设置了包含保护,您仍然可以通过遵循以下规则来提高编译效率(对产品没有影响):
不要在源代码级别包含两次相同的标头。
#include <stdio.h>
...40 other project specific includes...
#include <stdio.h>
(是的,我在实际代码中看到过它;我经常修复它。而且,正如 cmets 中所指出的,这并不是一个非常糟糕的性能问题,但它在代码中很混乱。)
不要包含不需要的标头。
【讨论】:
包含守卫可以非常简单地处理同一文件的多个包含。删除多余的包含更多的是清理问题,而不是任何客观优势。 清理确实加快了编译时间。最好的例子是WIN32_LEAN_AND_MEAN
。它确实适用于更大的项目。【参考方案2】:
所以你问的是代码中有一个大标题和五个小标题有什么区别?编译时在“include”行的位置添加了header的主体,因此#include只是修改了源代码并且不会使应用程序在运行时变慢。这不会影响性能,但是在制作大型项目时,您将需要多个标头,而不是制作大型标头,原因与不在一个源代码中编写整个应用程序的原因相同。
【讨论】:
【参考方案3】:如果您引用包含在#include
中的静态标头,则在运行时没有区别。编译器会将这些头文件中的所有“信息”组合到一个程序中。
【讨论】:
什么是“静态”标头? 糟糕,我的意思是静态库【参考方案4】:如果您最终更改了包含标头的顺序,并且您的标头正在做标头不应该做的事情(即定义对象而不仅仅是类型和函数),那么您可能会更改内存位置并影响运行时性能。
或者,如果您有多余的内联定义函数声明(这也不是一个好主意),并且您重新排序标题以便定义对更多或更少的调用站点可见,那么运行时性能可能会改变(尽管大多数优化器应该能够向上内联)。
请注意,如果您的代码受到这些更改的影响,它可能容易受到实际破坏,例如重新排序更改在使用时可见的模板特化集。
【讨论】:
以上是关于头文件包含和性能注意事项 c++的主要内容,如果未能解决你的问题,请参考以下文章