C ++:windows.h一般是一个高效的代码库吗?

时间:2010-04-22 23:04:16

标签: c++ windows performance header-files

我听到有人抱怨包括在C ++应用程序中的Windows头文件和使用它。他们提到效率低下。这只是一些都市传奇还是背后真的有一些真实的事实?换句话说,如果您认为它是有效的或低效的,请解释这是如何与事实。

我不是C ++ Windows程序员大师。真的很感激有详细的解释。


*编辑:我想在编译时和执行时知道。很抱歉没有提到它。

6 个答案:

答案 0 :(得分:3)

如果您预先编译它,那么编译速度差异几乎不可察觉。预编译的缺点是每个项目只能有一个预编译的头文件,因此人们倾向于制作一个“precompiled.h”(或“stdafx.h”)并包含windows.h,boost,stl和所有内容否则他们需要在那里。当然,这意味着你最终会在每个 .cpp文件中包含windows.h,而不仅仅是那些需要它的文件。这可能是跨平台应用程序中的一个问题,但您可以通过在静态库中执行所有特定于win32的内容(具有预编译的windows.h)并链接到主可执行文件中的内容来解决这个问题。

在运行时,windows.h中的东西与Windows中的东西差不多。所以在这方面确实没有“低效率”。

我想说大多数做严肃的Windows GUI的人都会使用第三方库(Qt,wxWidgets,MFC等),这些库通常是上定义的Win32内容。 windows.h(大部分),正如我所说,在Windows上,windows.h中的东西基本上都是裸机。

答案 1 :(得分:3)

windows.h不是“代码库”。它是一个头文件,并不包含任何可执行代码(除了宏定义,但仍然没有编译 - 当你使用它们时,它们的扩展是。)

因此,从性能角度严格看待它,仅仅包括它对编译时间有任何影响。但这一点非常重要 - 例如,如果使用VS2010附带的Platform SDK标头,#include <windows.h>扩展到~2.4Mb的代码 - 并且所有代码都必须由编译器解析和处理。

然后再次,如果你使用预编译的头文件(在这种情况下你应该这样),它不会影响你。

答案 2 :(得分:2)

正如已经指出的那样,#include windows.h会减慢编译时间。您可以使用预编译的头文件或者很好地将Windows调用隔离到需要它们帮助的模块。

此外,您可以在windows.h之前添加这些preproc定义,如下所示:

#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <windows.h>

它将减少windows.h和子包含头文件中的定义数量。稍后您可能会发现需要删除精益和平均值,但请先尝试并等到编译器抱怨缺少def。

名称空间冲突是一种合法的抱怨,但在技术上与效率无关,除非您计算个人使用时间的效率。考虑到将在命名空间中抛出数千个定义,冲突肯定会在某个时刻发生,这可能会非常恼人。只需使用将Windows调用隔离到模块中的做法,您就可以了。为此,将#include windows.h放在.cpp文件中,而不是.h文件。

我认为没有理由认为包含windows.h会影响可执行文件的运行时性能。您只是在编译器使用的上下文中添加了大量定义。您甚至没有将所有定义放入已编译的代码中 - 只是根据源代码(.cpp)中使用的任何定义进行分配,函数调用和引用。

可以提出另一个论点,即Windows API类型和函数本质上是浪费资源或执行效率低下的。即如果你想创建一个文件,有一些怪异的结构传递给Windows API。尽管如此,我认为这大部分都是一分钱/愚蠢的想法。逐个评估Windows API性能问题,并尽可能地替换低效代码。

答案 3 :(得分:1)

有很多地方可以提高效率。

包括<windows.h>将大大增加编译时间并引入许多符号和宏。其中一些符号或宏可能与您的代码冲突。因此,从这个角度来看,如果你不需要<windows.h>,那么在编译时将它带入它将是低效的。

通过使用预编译头可以稍微减少编译时间,但这也会带来更多的代码库复杂性(PCH需要至少2个文件),以及PCH独有的一些令人头疼的问题。尽管如此,对于大型Windows项目,我通常使用PCH。对于玩具或公用事业项目,我通常不这样做,因为它比它的价值更麻烦。

效率也会在运行时发挥作用。据我所知,如果你#include <windows.h>但不使用任何这些工具,它对程序的运行时行为没有任何影响,至少就调用额外代码和那种东西而言。但是我可能还有其他运行时效果。

就白大象问题而言,“Windows效率高吗?”除了这样说之外,我不会再谈到这一点:使用Windows与其他任何东西一样,效率或低效率主要取决于您以及您如何使用它。你会得到尽可能多的不同意见,从“Winblowz糟透了”到“我喜欢Windows,它真棒”。全部忽略它们。如果您需要,请学习在Windows中编写代码。想要,然后自己决定。

答案 4 :(得分:1)

一般来说,包括windows.h是必要的:如果你需要Windows功能,你必须包含它。我认为你所引用的是(除其他外)嵌套包含的windows.h。也就是说,你包含一个.h,它包含自己的windows.h,你在你的.cpp文件中包含了windows.h.当然,这会导致效率低下,因此您必须在代码中很好地研究每个.h文件中包含的.h文件,并避免包括,例如,windows.hn次间接。< / p>

答案 5 :(得分:0)

  • 仅使用标题而不使用它将不会对运行时效率产生任何影响
  • 这会影响编译时间..