我听到一些人抱怨在C ++应用程序中包含 Windows头文件并使用它。 他们提到这是低效的。 这只是一些城市的传说,还是真的有一些真实的事实背后呢? 换句话说,如果你认为它是有效的或者效率低下的,请解释一下这可能与事实有关。
我不是C ++的Windows程序员大师。 真的很感激有详细的解释。
*编辑:我想知道在编译时和执行。 对不起,不提。
如果您预编译它,那么编译速度差异几乎不明显。 预编译的缺点是每个项目只能有一个预编译的头文件,所以人们往往会做一个“precompiled.h”(或“stdafx.h”),包括windows.h,boost,stl和所有东西否则他们需要在那里。 当然,这意味着你最终会在每个 .cpp文件中包含windows.h文件,而不仅仅是那些需要它的文件。 这可能是跨平台应用程序中的一个问题,但是您可以通过在静态库(包含windows.h预编译)中链接到您的主要可执行文件中来解决所有特定于win32的问题。
在运行时,windows.h中的东西大概就像在Windows中一样。 所以在这方面确实没有“低效率”。
我会说,大多数人做严重的Windows图形用户界面的东西会使用第三方库(Qt,wxWidgets,MFC等),它通常是在windows.h(大部分)中定义的Win32的东西之上 ,所以如我所说,在Windows上,windows.h中的东西基本上是裸机。
windows.h
不是一个“代码库”。 这是一个头文件,并没有包含任何可执行代码(除了宏定义,但仍然没有编译 – 它们的扩展是,如果当你使用它们)。
因此,严格从性能角度来看,仅仅包括它在编译时间上有任何作用。 但是,这是相当重要的,例如,如果使用VS2010附带的Platform SDK头文件, #include <windows.h>
将扩展到〜2.4Mb的代码,并且所有代码都必须由编译器解析和处理。
然后再一次,如果你使用预编译头文件(你可能应该在这种情况下),它不会影响你。
正如已经注意到的,#including windows.h减慢了编译时间。 你可以使用预编译的头文件,或者只把窗口调用隔离到需要它们帮助的模块上。
另外,你可以在windows.h之前添加这些预处理定义,如下所示:
#define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include <windows.h>
它会减少来自windows.h和sub-include头文件的定义数量。 您稍后可能会发现,您需要删除精益平均值,但先尝试一下,然后等到编译器抱怨缺少def。
命名空间的冲突是一个合理的抱怨,但技术上与效率无关,除非你计算你个人使用时间的效率。 考虑到有多少个定义会被抛入你的名字空间,冲突肯定会发生在某个时刻,而这可能会让你感到非常恼火。 只要使用隔离你的Windows调用模块的做法,你会没事的。 为此,将#include windows.h放在.cpp文件中,而不是.h文件。
我认为没有理由认为包含windows.h会影响可执行文件的运行时性能。 您只是将大量的定义添加到编译器使用的上下文中。 你甚至没有把所有的定义放到你编译的代码中 – 只是基于源代码中使用的任何定义(.cpp)的分配,函数调用和引用。
另一个观点可能是Windows API的类型和功能固有地浪费资源或者效率低下。 即如果你想创建一个文件,有一些怪异的结构传递给Windows API。 不过,我认为大部分这是愚蠢的/愚蠢的思想。 根据具体情况评估Windows API性能问题,并在可能和有价值的情况下替换效率低下的代码。
有多个地方效率来玩。
包括<windows.h>
会大大增加编译时间,并引入许多符号和宏。 其中一些符号或宏可能与您的代码冲突。 所以从这个角度来看,如果你不需要<windows.h>
,那么在编译的时候将会是低效率的。
编译时间的增加可以通过使用预编译头来得到缓解,但这也会带来更多的代码库复杂性(至少需要2个PCH文件)以及一些PCH特有的问题。 尽管如此,对于大型Windows项目,我通常使用PCH。 对于玩具或公用事业项目,我通常不会因为它比它的价值更麻烦。
效率也可以在运行时发挥作用。 据我所知,如果你#include <windows.h>
但不使用任何这些工具,至少就调用额外的代码和类型的东西,它将不会影响你的程序的运行时行为。 可能还有其他运行时效果,但我不知道。
就大白象问题来说,“Windows效率高吗?” 除此之外,我不会介绍这种情况:使用Windows就像其他任何事情一样,它的效率或低效率主要取决于你,以及你如何知道如何使用它。 不过,就像你问的人一样,你会得到很多不同的意见,从“Winblowz糟糕”到“我喜欢Windows,真棒”。 忽略他们。 学习在Windows中编码,如果你需要和想要,然后做出自己的想法。
一般来说,包括windows.h是必须的:如果你需要windows函数,你必须包含它。 我认为你所指的是(除其他外)嵌套的windows.h。 也就是说,你包含一个包含windows.h的.h文件,并且在你的.cpp文件中也包含了windows.h文件。 这当然会导致效率低下,所以你必须在你的代码中很好地研究每个.h文件中包含了哪些.h文件,并且避免包含间接的 windows.hn时间。