C生成最小的程序

贯彻我的观念——学C/C++要精通编程环境(别听教材胡扯),当你为编译一个几KB甚至几百字节的程序而去研究编译选项时,也就脱离了照书打代码的菜鸟阶段。
    就以带标题的Hello World!消息框为示例(不带标题减小4~8字节),空函数当然更小,但是没有什么意义;Hello World消息框虽然简单,但实际上是纯API程序的基本架构,那种完全使用API的程序,多至数百行,其实都可以编译到10KB以下,通常我写纯API程序,都会使用编译选项进行最小化处理,写了一批1~3KB的小工具,多次骗过人家,让别人误以为是汇编语言写的。
    那种通过PE文件结构手动更改exe文件的做法我们就不采用了,那实际上是机器码编程……100多字节都能编出来。
1.对照组——MASM,win32汇编。
这应该是最小的了
编译选项:3,O,$B/ML.EXE /c /coff /Cp /nologo /I"$I",2
连接选项:5,O,$B/LINK.EXE /SUBSYSTEM:WINDOWS /ALIGN:4 /MERGE:.rdata=.text /MERGE:.data=.text /RELEASE /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3
EXE体积:596字节。

Assembly code

.386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib .data MsgBoxCaption db "标题",0 MsgBoxText db "Hello World!",0 .code start: invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK xor eax,eax ret end start


2.Visual C++ 2008
编译选项:/O1 /Os /Oy /GT /GL /D "_MBCS" /FD /MD /GS- /fp:fast /Fo"Release//" /Fd"Release/vc90.pdb" /W4 /nologo /c /Wp64 /TP /errorReport:prompt
连接选项:/OUT:"N:/Project/Test/HelloWorld/Visual C++ 2008/Release/HelloWorld.exe" /NOLOGO /MANIFEST:NO /NODEFAULTLIB /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /ENTRY:"main" /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORT:PROMPT user32.lib /align:4 /merge:.rdata=.text /merge:.data=.text
EXE体积:612字节,VC2005、VC2003生成文件体积完全相同,选项微调。 C/C++ code

#include <windows.h> void main() { MessageBox(NULL,"Hello World!","标题",MB_OK); }


3.Visual C++ 6
源码同上。
编译选项:/nologo /Zp1 /MD /W4 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/HelloWorld.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
连接选项:user32.lib /nologo /entry:"main" /subsystem:windows /incremental:no /pdb:"Release/HelloWorld.pdb" /machine:I386 /nodefaultlib /out:"Release/HelloWorld.exe" /opt:nowin98 /align:4 /merge:.rdata=.text /merge:.data=.text
EXE体积:600字节。
4.Code::Blocks 8.02
编译选项:-Wall -O3 -Os -s
连接选项:-nostdlib -Wl,--file-alignment=0x0001 -Wl,--section-alignment=0x0001 -mwindows (gcc的合并段选项貌似没什么用,-fmerge-all-constants)
EXE体积:684字节。 C/C++ code

#include <windows.h> void _start() { MessageBox(NULL,"Hello World!","标题",MB_OK); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值