這篇文章主要介紹“C++常量合并的方法是什么”,在日常操作中,相信很多人在C++常量合并的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++常量合并的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站主要為客戶提供服務(wù)項目涵蓋了網(wǎng)頁視覺設(shè)計、VI標(biāo)志設(shè)計、成都全網(wǎng)營銷、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式網(wǎng)站建設(shè)、成都手機(jī)網(wǎng)站制作、微商城、網(wǎng)站托管及網(wǎng)站維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計、SEO優(yōu)化排名。設(shè)計、前端、后端三個建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為集裝箱行業(yè)客戶提供了網(wǎng)站改版服務(wù)。
下面是一個例子 APP.cpp文件中的 main函數(shù):
int main() { return 7 + 8; }
首先須知:
我們將從命令行來構(gòu)建程序(而不是Visual Studio)
我們會使用Visual Studio 2012。 特別注意的是,這個版本的編譯器會產(chǎn)生x64位代碼(而不是已經(jīng)過時的x86架構(gòu))在64位機(jī)子上編譯。
如果你想要繼續(xù),請看下說明。實際上,你只需要從Visual Studio 列表里選擇一個正確的變體。
(注意:如果你正在使用Visual Studio Express上的免費編譯器,它僅僅只能運行在x86上,但是也會順利生成x64的代碼。對這個實驗同樣有用。)
我們可以通過命令 CL /FA App.cpp來構(gòu)建示例程序。用/FA開關(guān)創(chuàng)建一個輸出文件,用來保存編譯器生成的匯編代碼,可以輸入type App.asm來顯示:
PUBLIC main _TEXT SEGMENT main PROC mov eax, 15 ret 0 main ENDP _TEXT ENDS END
有趣的是這條指令 move ax,15—-僅僅將15賦值給寄存器EAX(根據(jù)x64調(diào)用標(biāo)準(zhǔn)的定義,x64函數(shù)將會設(shè)置一個int值,作為函數(shù)的結(jié)果,并返回給調(diào)用者)。編譯器運行期間并沒有發(fā)出 7加8的指令。就像下面這樣:
PUBLIC main _TEXT SEGMENT main PROC mov eax, 7 add eax, 8 ret 0 main ENDP _TEXT ENDS END
(注意看了,這兩段代碼的***一條指令,ret 0,是指將控制權(quán)返回給調(diào)用者,并從棧里彈出0個字節(jié)。不要被誤導(dǎo)認(rèn)為是返回數(shù)值0給調(diào)用者?。?/p>
我猜到,你可能在想:這很好啊,但是哪個白癡會想到在代碼里寫 7+8 這樣的運算?的確,你是對的,但是編譯器會把這樣的結(jié)構(gòu)看成是有副作用的宏??戳讼旅娴睦樱憔蜁靼壮A亢喜⑹且粋€很有用的優(yōu)化方法:
#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 }
我們要創(chuàng)建一個足夠大的表保存每一秒的記錄,所以table_size就是表的大小,用字節(jié)表示。很容易查看變量table_size的匯編指令:
mov DWORD PTR table_size$[rsp], 1382400 ; 00151800H
這兒沒有乘法指令,60*60*24*16=1382400 是在編譯時計算的。
事實上,我們窺探下編譯器的內(nèi)部,會發(fā)現(xiàn)這種常量合并的運算非常簡單,它是由前端來執(zhí)行的。它并不需要后端優(yōu)化器笨重的提升能力。所以它總是存在的。不管你是開啟優(yōu)化(使用 /O2)或者關(guān)閉優(yōu)化(/Od)都沒什么區(qū)別—–該優(yōu)化總是自動執(zhí)行的。
不管表達(dá)式有多復(fù)雜,我們都能在編譯期間進(jìn)行常量合并嗎?—事實上,前端可以處理任意的常量算術(shù)表達(dá)式(甚至包括上面提到的sizeof,只要它們在編譯時能被計算出來)和運算符(+ - * / % << >> ++ 和 –)。你甚至可以使用布爾值,邏輯運算符 和條件運算符if AND ?:。
有沒有常量合并需要后端優(yōu)化器的時候呢?當(dāng)然有,看下面的例子:
int bump(int n) { return n + 1; } int main() { return 3 + bump(6); }
輸入命令cl /FA /Od App.cpp,會得到信息:不能優(yōu)化,謝謝!,輸入 App.asm,我們會得到:
mov ecx, 6 call ?bump@@YAHH@Z ; bump add eax, 3
正如我們所預(yù)料的: ECX會保存***個參數(shù)6,根據(jù)x64調(diào)用約定,然后調(diào)用bump函數(shù),結(jié)果返回給EAX,然后EAX再加3。
我們來看看如果我們使用 cl /FA /O2 App.cpp 來進(jìn)行優(yōu)化,會發(fā)生什么。
mov eax,10
到此,關(guān)于“C++常量合并的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當(dāng)前標(biāo)題:C++常量合并的方法是什么
地址分享:http://jinyejixie.com/article44/gpgcee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、外貿(mào)建站、品牌網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)