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