我有这段代码:
#include <iostream>
using namespace std;
int main(){
cout<<"Hi there!";
return 0;
}
我通过&#34; VS2012开发人员命令提示符&#34;使用这一行:
cl -GS name.cpp
这又导致了137kb的可执行文件。
虽然我知道137kb在现代计算中并不算什么,但对于它运行的代码量来说,它似乎仍然是一个非常大的文件。此外,尝试编译类似的代码,但使用int
变量会在顶部添加另外15kb。编译期间整数会发生什么变化,它必须如此重要?
答案 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是一个工作机器,它必须打开一个控制台,记下你的字符串,能够自行终止。我相信这就是占用大部分程序空间的东西。