91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++常量合并的方法是什么

發布時間:2021-11-30 16:47:39 來源:億速云 閱讀:171 作者:iii 欄目:編程語言

這篇文章主要介紹“C++常量合并的方法是什么”,在日常操作中,相信很多人在C++常量合并的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++常量合并的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

下面是一個例子 APP.cpp文件中的 main 函數:

int main() { return 7 + 8; }

首先須知:

  1. 我們將從命令行來構建程序(而不是Visual Studio)

  2. 我們會使用Visual Studio 2012。 特別注意的是,這個版本的編譯器會產生x64位代碼(而不是已經過時的x86架構)在64位機子上編譯。

如果你想要繼續,請看下說明。實際上,你只需要從Visual Studio 列表里選擇一個正確的變體。

(注意:如果你正在使用Visual Studio Express上的免費編譯器,它僅僅只能運行在x86上,但是也會順利生成x64的代碼。對這個實驗同樣有用。)

我們可以通過命令 CL /FA App.cpp來構建示例程序。用/FA開關創建一個輸出文件,用來保存編譯器生成的匯編代碼,可以輸入type App.asm來顯示:

PUBLIC  main _TEXT   SEGMENT main    PROC         mov     eax, 15         ret     0 main    ENDP _TEXT   ENDS END

有趣的是這條指令 move ax,15—-僅僅將15賦值給寄存器EAX(根據x64調用標準的定義,x64函數將會設置一個int值,作為函數的結果,并返回給調用者)。編譯器運行期間并沒有發出 7加8的指令。就像下面這樣:

PUBLIC  main _TEXT   SEGMENT main    PROC         mov     eax, 7         add     eax, 8         ret     0 main    ENDP _TEXT   ENDS END

(注意看了,這兩段代碼的***一條指令,ret 0,是指將控制權返回給調用者,并從棧里彈出0個字節。不要被誤導認為是返回數值0給調用者!)

我猜到,你可能在想:這很好啊,但是哪個白癡會想到在代碼里寫 7+8 這樣的運算?的確,你是對的,但是編譯器會把這樣的結構看成是有副作用的宏。看了下面的例子,你就會明白常量合并是一個很有用的優化方法:

#define SECS_PER_MINUTE  60 #define MINUTES_PER_HOUR 60 #define HOURS_PER_DAY    24   enum Event { Started, Stopped, LostData, ParityError };   struct {     int        clock_time;     enum Event ev;     char*      reason; }   Record;   int main() {     const int table_size = SECS_PER_MINUTE * MINUTES_PER_HOUR * HOURS_PER_DAY * sizeof Record;     // rest of program }

我們要創建一個足夠大的表保存每一秒的記錄,所以table_size就是表的大小,用字節表示。很容易查看變量table_size的匯編指令:

mov     DWORD PTR table_size$[rsp], 1382400     ; 00151800H

這兒沒有乘法指令,60*60*24*16=1382400 是在編譯時計算的。

事實上,我們窺探下編譯器的內部,會發現這種常量合并的運算非常簡單,它是由前端來執行的。它并不需要后端優化器笨重的提升能力。所以它總是存在的。不管你是開啟優化(使用 /O2)或者關閉優化(/Od)都沒什么區別—–該優化總是自動執行的。

不管表達式有多復雜,我們都能在編譯期間進行常量合并嗎?&mdash;事實上,前端可以處理任意的常量算術表達式(甚至包括上面提到的sizeof,只要它們在編譯時能被計算出來)和運算符(+ - * / % << >> ++ 和 &ndash;)。你甚至可以使用布爾值,邏輯運算符 和條件運算符if AND ?:。

有沒有常量合并需要后端優化器的時候呢?當然有,看下面的例子:

int bump(int n) { return n + 1; }     int main() { return 3 + bump(6); }

輸入命令cl /FA /Od App.cpp,會得到信息:不能優化,謝謝!,輸入 App.asm,我們會得到:

mov     ecx, 6 call    ?bump@@YAHH@Z                           ; bump add     eax, 3

正如我們所預料的: ECX會保存***個參數6,根據x64調用約定,然后調用bump函數,結果返回給EAX,然后EAX再加3。

我們來看看如果我們使用 cl /FA /O2 App.cpp 來進行優化,會發生什么。

mov eax,10

到此,關于“C++常量合并的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

嘉黎县| 财经| 栾城县| 武鸣县| 军事| 吉安市| 武城县| 汕头市| 班玛县| 抚顺市| 阿克苏市| 文昌市| 平陆县| 宁化县| 连城县| 德阳市| 元朗区| 诸城市| 安宁市| 玛沁县| 大厂| 大余县| 原阳县| 锦州市| 龙游县| 霸州市| 兴安盟| 巨鹿县| 兴义市| 宿州市| 南宫市| 开鲁县| 阜城县| 西吉县| 泰州市| 萍乡市| 青神县| 大余县| 竹山县| 华亭县| 岱山县|