Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;编译器优化输出#未使用的包含?_C++_Optimization_Include_C Preprocessor - Fatal编程技术网

C++ C++;编译器优化输出#未使用的包含?

C++ C++;编译器优化输出#未使用的包含?,c++,optimization,include,c-preprocessor,C++,Optimization,Include,C Preprocessor,在构建不断增长的类/函数库时,我经常看到一种“伞形”头文件,它包含项目的所有公共头文件。例如: dsp.h #include "file1.h" #include "file2.h" ... #include "filex.h" 有时我可能需要所有东西,但其他时候可能只需要选择一些功能/选项。如果#包括dsp.h,但不使用file2.h中的任何内容(例如),编译器知道吗?是否有可能在构建中对其进行优化 否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全

在构建不断增长的类/函数库时,我经常看到一种“伞形”头文件,它包含项目的所有公共头文件。例如:

dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"
有时我可能需要所有东西,但其他时候可能只需要选择一些功能/选项。如果#包括dsp.h,但不使用file2.h中的任何内容(例如),编译器知道吗?是否有可能在构建中对其进行优化


否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全、更有效的解决方案?

< P>因为预处理器是C++编译器的独立程序(和语言),预处理器无法知道使用的是什么。因此编译器将接收头文件中的所有内容。

预处理器不会进行任何优化。它对代码的语义一无所知,因此无法判断您是否在使用头文件中的任何内容。因此,不,
#include
语句没有优化。

您是在谈论代码优化还是构建时间优化

不必要的、未使用的头不会更改正在生成的代码,因此这里没有优化的问题


但是,它会增加构建时间。这不是由构建工具优化的。如果你想优化编译时间,请参阅本书<强>大型C++软件设计<强> > <强> John Lakos < /St>>

< P>读取包含文件,并在编译器真正生成代码之前插入源代码的一部分。
对。一般来说,程序未引用的内容不会放入最终可执行文件中。可以认为这是一种优化。细节会因编译器和链接器的不同而有所不同。

我说的是代码优化,而不是构建时间。基本上,如果包含一个未使用的头文件,它是否仍会包含在生成的可执行文件中,从而增加代码大小?@user93353在不知道头文件的代码的情况下,您无法做出决定。@NikosC。您是否有一个示例,其中头未使用,但仍然增加了代码大小?@user93353是一个典型的类头。该类所需的所有数据/代码显然都保存在二进制文件中。一个简单的测试是用一个空的main()函数编译一个简单的程序。在我的系统上,创建的对象文件是752字节。仅添加这一个include:
#include
将生成一个992字节大的对象文件。删除所有调试符号。大多数头文件都会有这种效果。@NikosC。我在VisualStudio2010上试过了。我的exe大小在只有一个空
main
的程序和一个有
#include
的程序之间不会改变。它保持不变。我认为链接器应该足够聪明,可以丢弃所有未使用的东西。当然,标准中没有提到这一点,但任何成熟的链接器都应该能够做到这一点。此外,iostream可能是一种特殊情况-可能只有在至少包含一个std库头时,您的工具才会拉入标准库。