#include会影响程序大小吗?

4 c++ compilation

当我的cpp文件使用#include添加一些标题时,我的最终程序的大小是否会变大?标头不被视为编译单元,但是头文件的内容由预处理器添加到实际的源文件中,因此输出文件(exe或dll)的大小是否会受此影响?

编辑:我忘了提到问题不是关于模板/内联函数.我的意思是如果我将#include放在一个没有任何函数实现细节的头文件中会发生什么.谢谢

T.E*_*.D. 10

这取决于内容以及编译器的实现方式.很可能如果你不在头文件中使用任何东西,你的编译器就会足够智能,不会将任何内容添加到你的可执行文件中.

但是,我不会指望这一点.我知道回到VC++ 6天后我们发现,#includeWindows.h为每个执行它的源文件添加了64K到excecutable.


Bob*_*phy 6

你澄清说:

[标题没有]模板/内联函数...没有任何函数的实现细节.

一般来说,不,添加头文件不会影响程序大小.

你可以测试一下.获取已构建的程序,并检查可执行文件的大小.然后进入每个.cpp文件并包含该文件中实际不需要的标准C或C++头文件.构建程序并再次检查可执行文件大小 - 它应该与以前一样大小.

总的来说,影响可执行文件大小的唯一因素是导致编译器生成不同数量的代码,全局/静态变量初始化或DLL /共享库用法的那些.即便如此,如果程序运行不需要任何此类项目,大多数现代链接器都会抛弃这些东西.

所以包括只包含函数原型,没有内联的类/结构定义和枚举定义之类的头文件不应该改变任何东西.

但是,肯定有例外.这里有几个.

一个是你有一个简单的链接器.然后,如果添加一个生成程序实际上不需要的东西的头文件,并且链接器不会将它们抛出,则可执行文件的大小会膨胀.(有些人故意以这种方式构建链接器,因为链接时间会非常快.)

很多时候,添加添加或更改预处理程序符号定义的头文件将更改编译器生成的内容.例如,assert.h(或cassert)定义了assert()宏.如果在.c/.cpp文件中包含一个更改NDEBUG预处理程序符号定义的头文件,它将更改assert()用法是否生成任何代码,从而更改可执行文件大小.

此外,添加更改编译器选项的头文件将更改可执行文件大小.例如,许多编译器允许您通过类似#pragma pack line 更改结构的默认"打包" .因此,如果添加一个更改.c/.cpp文件中的结构打包的头文件,编译器将生成用于处理结构的不同代码,从而更改可执行文件大小.

正如其他人指出的那样,当你处理Visual C++/Visual Studio时,所有的赌注都没有了.对于他们的开发工具,微软有一个独特的视角,人们不会在其他平台上编写编译系统.