在什么条件下必须编译cpp代码并将其链接到exe

时间:2016-01-27 04:35:04

标签: c++ visual-studio-2012

我正在使用Visual Studio 2012的MSVC ++来构建基本的非托管c ++ x86 / x64 Windows和控制台子系统程序。 (异常处理已关闭)

我有一个相当大的项目,当我对最终的exe大小感到好奇时,我决定看看如果我将main()函数更改为什么都不做就会有多大(所以不要调用或引用任何其他代码。我注意到exe的大小仍然比我从项目中删除所有cpp文件时要大得多。

所以我想知道哪些类型的C ++代码会导致代码链接,即使main函数什么都不做。一个例子是在你的一个类型A的cpp文件中有一个全局变量,其中A是一个类/结构。在这种情况下,我会假设必须包含A的构造函数和析构函数,以及所有A成员类型的构造函数和析构函数。

在visual studio中,我启用了所有优化,包括链接器,以消除从未引用的函数/数据,以及comdat折叠。和cpp代码生成以启用comdats /功能级别链接。

更新 我没有使用任何C ++ 11或更高版本的功能。虽然我不确定我的构建环境是否已设置为构建c ++ 11或更高版本,或者这是否会产生任何影响。

1 个答案:

答案 0 :(得分:1)

从技术上讲,不需要包含全局因为它有一个构造函数。 C ++遵循图模型,其中main充当根翻译单元。从一个TU到另一个TU的函数调用构成了图的边缘。可能会跳过独立的TU。

MSVC ++有另一种选择,不是使用TU而是使用单独的函数作为图中的节点(/ COMDAT)。与/ OPT:ICF结合使用可进一步降低可执行文件的大小。抛弃函数本身就是一种胜利,但也可以删除其他依赖项。

这种模式的缺点是某些自我注册方案是不可移植的,因为进行自我注册的类不是任何东西的依赖,因此可以被删除。