貫徹我的觀念——學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 void main()
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 void _start()
C 最小生成樹
樹是指沒有環路的圖,生成樹就是指乙個圖上面刪除一些邊,使它沒有環路。最小生成樹就是指生成樹中邊權之和最小的那一種。上圖的最小生成樹就是這樣 就以上圖為例 先選擇乙個起始點,我們就以a為例。建立乙個集合s,用來儲存已經在樹中間的點。開始時集合那只有點a,即 s 選擇乙個連通到集合s中乙個點的最小邊,其...
C 最小生成樹問題
問題描述 求乙個連通無向圖的最小生成樹的代價 圖邊權值為正整數 輸入 第一行是乙個整數n 1 n 20 表示有多少個圖需要計算。以下有n個圖,第i圖的第一行是乙個整數m 1 m 50 表示圖的頂點數,第i圖的第2行至1 m行為乙個m m的二維矩陣,其元素ai,j表示圖的i頂點和j頂點的連線情況,如果...
C 實現最小生成樹
第一種 求最小生成樹,普里姆演算法 prim 先給定乙個初始點,然後找到離它最近的點,並加入找的點序列,將其對應的距離設為0 然後找其它頂點距離新的找到點集合最小的點,再加入找到的點序列 重複以上過程 public static void prim minitree graph g console....