1、vc ->Project->Setting->C/C++ 的最佳化選項依賴與Category下拉框:
提供了最有效選擇一個一般最佳化目標的方法,但不允許精細地控制單個最佳化技術 在最佳化選項下有5種選擇:Default、Disable(Debug)、Maximize Speed、Minimize Size和Customize。其中Disable關閉所有最佳化選項,當需要編譯器執行一些所關切的更快速代碼最佳化,而清除其他所有最佳化包括Disable時,可以使用Default。對於函數級串連和字串假離線,Customize最佳化選項提供了對最佳化開關的手工控制。General Category的Maximize Speed 和 Minimum Size Settings
最佳化選項 |
Maximize Speed |
Minimum Seize |
產生內建函式內聯 |
√ |
無 |
快速代碼最佳化 |
√ |
無 |
最小代碼最佳化 |
無 |
√ |
全域最佳化啟用 |
√ |
√ |
忽略幀指標 |
√ |
√ |
堆棧檢查關閉 |
√ |
√ |
字串假離線啟用 |
√ |
√ |
函數級連結啟用 |
√ |
√ |
選擇針對處理器的最佳化和一個工程的預設調用規範。 CodeGeneration 包括使用者現在的針對特殊處理器的最佳化選項、預設的調用規、應用程式所使用的運行時類庫以及成員結構的對其方式。 選擇處理器 Processor選擇指示編譯器最佳化,預設設定下是Blend表示一種折衷處理。 選擇調用規範 Visual C++允許三種調用規範:__cdecl、__fastcall、__stdcall。調用規範決定了自左自右或者自右自左的參數傳遞。由誰負責清除堆棧以及函數名字解釋。
調用規範 |
傳送順序 |
堆棧清除執行者 |
解釋風格 |
__cdecl |
自右自左 |
調用程式 |
_functionName |
__fastcall |
自右自左 |
被調用程式 |
@functionName@nnn |
__stdcall |
自右自左 |
被調用程式 |
_functionName@nnn |
nnn----表示參數列表中的位元組數 (1) __stdcall調用 __stdcall是Pascal程式的預設調用方式,參數採用從右至左的壓棧方式,被調函數自身在返回前清空堆棧。WIN32 Api都採用__stdcall調用方式,這樣的宏定義說明了問題: #define WINAPI _stdcall 按C編譯方式,__stdcall呼叫慣例在輸出函數名前面加底線,後面加“@”符號和參數的位元組數,形如_functionName@nnn。 (2) __cdecl調用 __cdecl是C/C++的預設調用方式,參數採用從右至左的壓棧方式,傳送參數的記憶體棧由調用者維護。__cedcl約定的函數只能被C/C++調用,每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行檔大小會比調用__stdcall函數的大。 由於_cdecl調用方式的參數記憶體棧由調用者維護,所以變長參數的函數能(也只能)使用這種呼叫慣例。由於Visual
C++預設採用__cdecl 調用方式,所以VC中中調用DLL時,使用者應使用__stdcall呼叫慣例。按C編譯方式,__cdecl呼叫慣例僅在輸出函數名前面加底線,形如_functionName。 (3) __fastcall調用 __fastcall調用較快,它通過CPU內部寄存器傳遞參數。(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的記憶體棧),按C編譯方式,__fastcall呼叫慣例在輸出函數名前面加“@”符號,後面加“@”符號和參數的位元組數,形如@@functionName@nnn 選擇執行階段程式庫 參考下這篇文章:http://blog.csdn.net/wangqiulin123456/article/details/8877221 選擇結構對齊
自動選擇函數級的串連和字串假離線
允許精細調整一個工程的最佳化