-O3
這是指編譯時所採用最佳化的選項,其一般可以選擇的選項計有...
-O -O0 -O1 -O2 -O3 -Os
其中異同可以參考Linux中的man page,裡面有詳細的說明。
....
使用不同最佳化方式所編譯出來的執行檔,其檔案大小觀察如下
$ gcc -Wall helloworld.c -o helloworld
$ gcc -Wall helloworld.c -o helloworld.O3 -O3
$ gcc -Wall helloworld.c -o helloworld.Os -Os
$ ls -l
總計 28
-rwxr-xr-x 1 lungswu lungswu 6351 2010-02-25 10:37 helloworld
-rw-r--r-- 1 lungswu lungswu 123 2010-02-25 10:00 helloworld.c
-rwxr-xr-x 1 lungswu lungswu 6325 2010-02-25 10:37 helloworld.O3
-rwxr-xr-x 1 lungswu lungswu 6309 2010-02-25 10:37 helloworld.Os
$
當然,以上是以gcc-3.4編譯出來的結果,目前所做實驗中,最新的編譯器版本是gcc-4.3,同時,其編譯出來的結果會隨著編譯器的版本不同而產生不同結果,以下是以gcc-3.4以及gcc-4.3做不同編譯方式所產生的結果....
$ gcc -v
Reading specs from /usr/lib/gcc/i486-linux-gnu/3.4.6/specs
Configured with: ../src/configure -v --enable-languages=c,f77 --prefix=/usr --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit --with-tune=pentium4 i486-linux-gnu
Thread model: posix
gcc version 3.4.6 (Ubuntu 3.4.6-8ubuntu2)
$ gcc -Wall helloworld.c -o helloworld.3.4
$ gcc -Wall helloworld.c -o helloworld.3.4.Os -Os
$ gcc -Wall helloworld.c -o helloworld.3.4.O3 -O3
$ gcc -Wall helloworld.c -o helloworld.3.4.O0 -O0
$
$ gcc -v
使用內建 specs。
目的:i486-linux-gnu
配置為:../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
執行緒模型:posix
gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
$ gcc -Wall helloworld.c -o helloworld.4.3
$ gcc -Wall helloworld.c -o helloworld.4.3.Os -Os
$ gcc -Wall helloworld.c -o helloworld.4.3.O3 -O3
$ gcc -Wall helloworld.c -o helloworld.4.3.O0 -O0
$ ls -l
總計 84
-rwxr-xr-x 1 lungswu lungswu 6351 2010-02-25 10:43 helloworld.3.4
-rwxr-xr-x 1 lungswu lungswu 6351 2010-02-25 10:43 helloworld.3.4.O0
-rwxr-xr-x 1 lungswu lungswu 6325 2010-02-25 10:43 helloworld.3.4.O3
-rwxr-xr-x 1 lungswu lungswu 6309 2010-02-25 10:43 helloworld.3.4.Os
-rwxr-xr-x 1 lungswu lungswu 9150 2010-02-25 10:43 helloworld.4.3
-rwxr-xr-x 1 lungswu lungswu 9150 2010-02-25 10:44 helloworld.4.3.O0
-rwxr-xr-x 1 lungswu lungswu 9150 2010-02-25 10:44 helloworld.4.3.O3
-rwxr-xr-x 1 lungswu lungswu 9150 2010-02-25 10:43 helloworld.4.3.Os
-rw-r--r-- 1 lungswu lungswu 123 2010-02-25 10:00 helloworld.c
$
gcc-4.3做了不少改變,簡單程式不會因為使用不同的最佳化參數而產生不同的code size,其結果都一樣。
另外回到Hello World code size (1),之中提到一個命令:"file"
$ gcc -Wall helloworld.c -o helloworld
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$
file的結果中,有提到一個key word:"not stripped",這裡可以用以下方式找strip這個keyword之涵義:
$ whatis strip
strip (1) - Discard symbols from object files.
$
所以strip這命令可以將執行檔中所有symbol移除,所以應該會使code size小很多...
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ ls -l helloworld
-rwxr-xr-x 1 lungswu lungswu 6351 2010-02-25 10:52 helloworld
$ strip helloworld
$ ls -l helloworld
-rwxr-xr-x 1 lungswu lungswu 2876 2010-02-25 11:06 helloworld
$
使用strip command之後,code size減少了6351-2876=3475 bytes (with gcc-3.4)
No comments:
Post a Comment