專家剖析VS2003編譯成果
VS2003編譯表示不使用微軟為標準C做的語言擴展;Eliminate Duplicate Strings,主要用于字符串優(yōu)化(將字符串放到緩充池里以節(jié)省空間),使用這個參數,使得一些技術人員為之煩惱。
1) General:一些總體設置。Warning level用來控制警告信息,其中Level 1是最嚴重的級別;Warnings as errors將警告信息當作錯誤處理;Optimizations是代碼優(yōu)化,可以在Category的Optimizations項中進行更細的設置;VS2003編譯用以生成.sbr文件,記錄類、變量等符號信息,可以在Category的Listing Files項中進行更多的設置。Debug info,生成調試信息:None,不產生任何調試信息(編譯比較快);Line Numbers Only,僅生成全局的和外部符號的調試信息到.OBJ文件或.EXE文件,減小目標文件的尺寸;C 7.0- Compatible,記錄調試器用到的所有符號信息到.OBJ文件和.EXE文件;Program Database,創(chuàng)建.PDB文件記錄所有調試信息;Program Database for "Edit & Continue",創(chuàng)建.PDB文件記錄所有調試信息,并且支持調試時編輯。#t#
2) C++ Language:pointer_to_member representation用來設置類定義/引用的先后關系,一般為VS2003編譯表示在引用類之前該類肯定已經定義了;Enable Exception Handling,進行同步的異常處理;Enable Run-Time Type Information迫使編譯器增加代碼在運行時進行對象類型檢查;Disable Construction Displacements,設置類構造/析構函數調用虛函數問題。
3) Code Generation:Processor表示代碼指令優(yōu)化,可以為80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優(yōu)化。Use run-time library用以指定程序運行時使用的運行時庫(單線程或多線程,Debug版本或Release版本),有一個原則就是,一個進程不要同時使用幾個版本的運行時庫。Single-Threaded,靜態(tài)連接LIBC.LIB庫;Debug Single-Threaded,靜態(tài)連接LIBCD.LIB庫;Multithreaded,靜態(tài)連接LIBCMT.LIB庫;Debug Multithreaded,靜態(tài)連接LIBCMTD.LIB庫;Multithreaded DLL,動態(tài)連接MSVCRT.DLL庫;Debug Multithreaded DLL,動態(tài)連接MSVCRTD.DLL庫。VS2003編譯連接了單線程庫就不支持多線程調用,連接了多線程庫就要求創(chuàng)建多線程的應用程序。#t#
VS2003編譯可以用來設定調用約定,有三種:__cdecl、__fastcall和__stdcall。各種調用約定的主要區(qū)別在于,函數調用時,函數的參數是從左到右壓入堆棧還是從右到左壓入堆棧;在函數返回時,由函數的調用者來清理壓入堆棧的參數還是由函數本身來清理;以及在編譯時對函數名進行的命名修飾(可以通過Listing Files看到各種命名修飾方式)。Struct member alignment用以指定數據結構中的成員變量在內存中是按幾字節(jié)對齊的,根據計算機數據總線的位數,不同的對齊方式存取數據的速度不一樣。這個參數對數據包網絡傳輸等應用尤為重要,不是存取速度問題,而是數據位的精確定義問題,一般在程序中使用#pragma pack來指定。

















