【发布时间】:2016-08-27 07:18:43
【问题描述】:
在包含整个库(可能包含数百个函数)和仅使用单个函数之间是否存在任何运行时性能差异:
#include<foo>
int main(int argc, char *argv[]) {
bar();//from library foo
return 0;
}
以及将库中的相关代码片段直接粘贴到代码中,例如:
void bar() {
...
}
int main(int argc, char *argv[]) {
bar();//defined just above
return 0;
}
什么会阻止我在 C 文件的开头盲目地包含所有我最喜欢(和最常用)的库?这个流行的线程C/C++: Detecting superfluous #includes? 表明编译时间会增加。但是编译后的二进制文件会有什么不同吗?第二个程序实际上会胜过第一个程序吗?
相关:what does #include <stdio.h> really do in a c program
编辑:这里的问题与相关的Will there be a performance hit on including unused header files in C/C++? 问题不同,因为这里包含一个 single 文件。我在这里询问是否包含单个文件与将实际使用的代码片段复制粘贴到源代码中是否有任何不同。我稍微调整了标题以反映这种差异。
【问题讨论】:
-
我的经验法则是只包含您需要的内容。如果您包含您不需要的内容,您可能会使人们感到困惑,因为他们可能认为您包含它是有原因的,而您实际上并没有。
-
您所展示的 - 包括标题。标头主要由 声明 组成,它们根本不会影响性能。在这里你最多可以破坏的是编译时间。但是说到库 - 一个像样的链接器无论如何都会消除所有未使用的东西。
-
@Eugene 你应该把这个作为答案! ;)
-
1.正如其他人所提到的,您包含的头文件仅与链接器最终可能加载的库部分相关。 2. 如果您使用静态链接,链接器将仅链接您实际使用/需要的模块。 (是否有任何额外的内容取决于库实现者是否为每个模块构建了一个或多个函数。) 3. 如果您使用动态链接(现在更常见),您“获得”整个库,但是它通常 (a) 按需分页和 (b) 与其他进程共享,因此您无需承担全部费用。
标签: c++ c performance include