几乎是空的.exe文件的重量是什么?

时间:2017-01-10 11:45:37

标签: c++ compilation exe

我有这段代码:

#include <iostream>
using namespace std;

int main(){
cout<<"Hi there!";
return 0;
}

我通过&#34; VS2012开发人员命令提示符&#34;使用这一行:

cl -GS name.cpp

这又导致了137kb的可执行文件。
虽然我知道137kb在现代计算中并不算什么,但对于它运行的代码量来说,它似乎仍然是一个非常大的文件。此外,尝试编译类似的代码,但使用int变量会在顶部添加另外15kb。编译期间整数会发生什么变化,它必须如此重要?

3 个答案:

答案 0 :(得分:3)

您的代码会引入标准库的IOstreams部分,由Microsoft实施。这意味着它还需要与C stdio同步,并支持全局变量的构造函数。

此外,默认构建是调试版本。显而易见的测试开关是/O1(针对大小进行优化)。未使用的整数变量应在发布版本中添加0个字节。 /DNDEBUG应该消除断言。

答案 1 :(得分:1)

默认编译器选项将MSVCRxxx.DLL嵌入到可执行文件中,使用/ MD选项运行相同命令时不会发生这种情况:

cl.exe /MD /EHsc name.cpp

使用此命令,可执行文件大小 15KB (使用VS2013 x86 Native Tools)。

这是因为默认选项启动编译器是/MT,而通过Visual Studio构建的项目的默认值是/MD(导致文件接近15KB)。使用/ MD选项,可执行文件较小,因为没有嵌入库。

在两个单独的命令中编译和链接(默认的Visual Studio Release解决方案配置命令):

cl /c /Zi /W3 /WX- /sdl /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _CONSOLE /D _LIB /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo /Fd /Gd /TP /analyze- /errorReport:prompt name.cpp

这将生成将在下一个链接步骤中使用的目标文件。

link.exe /ERRORREPORT:PROMPT /OUT:"c:\Dev\namefromlinker.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Dev\name.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"c:\Dev\name.lib" /MACHINE:X86 /SAFESEH name.obj

这会生成 12KB 的可执行文件。

编译器选项可以在下一个链接中找到:

https://msdn.microsoft.com/en-us/library/9s7c9wdw.aspx

尽管可能看起来它是一个非常小的可执行文件,但将用Linux编译的相同.cpp文件与g ++进行比较显示出相当大的差异。

g++ name.cpp - &gt; 9,0KB可执行文件大小

稍微优化一下:

g++ -O2 -s -DNDEBUG name.cpp - &gt; 6,3 KB可执行文件大小

答案 2 :(得分:0)

以这种方式思考:

.cpp是一个草图,而.exe是一个工作机器,它必须打开一个控制台,记下你的字符串,能够自行终止。我相信这就是占用大部分程序空间的东西。