C中#include的成本

时间:2009-12-26 19:11:37

标签: c include

说你#include并且从不使用stdio.h中的任何内容。与此相关的间接成本是多少?

我注意到很多网络代码包括他们可以想到的所有与网络相关的标题,以防他们最终使用其中一个的东西,所以我想知道这是否是某种易用性与效率权衡或如果没有效率损失。

8 个答案:

答案 0 :(得分:11)

主要是编译时开销,因为编译器必须包含并解析该文件。

答案 1 :(得分:6)

它应该只影响编译速度,而不是执行速度。至于编译时间开销,对于大型项目来说,它可能是显而易见的,但了解它如何影响您的项目的唯一方法是测量包含和不包含的编译时间。

答案 2 :(得分:4)

没有运行时效率损失。这更像是一个维护问题,因为包含多余的内容会使您不清楚实际使用的库。

答案 3 :(得分:3)

现在大多数热门编译器中的{p> Precompiled headers使得#include的包含成本几乎可以忽略不计。而且在运行时,由于链接器足够智能,不包含不需要的东西,所以没有任何东西仍然存在。

答案 4 :(得分:3)

一般来说,只有编译时间开销而不是运行时开销。链接器将仅链接到程序中真正使用的库部分。坏链接器将包含引用库的加载代码,即使它们根本不使用,因此您需要在启动时支付一些费用。

答案 5 :(得分:2)

包含不需要的文件会导致编译时间略有增加,但不会对生成的代码产生任何影响。

答案 6 :(得分:2)

任何开销主要是在编译时而不是运行时。

#include告诉编译器需要包含引用文件中的代码。所以它必须在文件出现时加载文件。这将花费有限的时间,具体取决于文件的实际位置和大小。

运行时唯一的开销是,如果编译器包含未被引用的代码,从而使可执行文件变得比它需要的大 - 这可能会增加启动时间。

答案 7 :(得分:1)

当然,它减慢了编译速度。在一般情况下,它还可能导致您的.exe包含全局变量甚至是您从未实际使用过的函数。

对于标准的C运行时标头,我不知道任何显着的运行时成本。对于其他标题,您需要小心。一些Windows标头声明了数百个UUID,这些UUID最终会使你的exe膨胀。

您发现在运行时是否花费任何成本的方法是查看链接器生成的.map文件。那里有没有你没想到的变量或函数吗?