国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

優(yōu)化C++代碼(3)常量合并

開發(fā) 后端
這篇文章講的是常量合并,這是VC++編譯器最簡單的優(yōu)化之一。 這種優(yōu)化,是指編譯器在編譯時(編譯期間)直接計算出表達式的結果,在生成的代碼中直接用計算結果替換表達式。 這樣就避免了程序在運行時執(zhí)行這些計算花費的成本。

這篇文章講的是常量合并,這是VC++編譯器最簡單的優(yōu)化之一。  這種優(yōu)化,是指編譯器在編譯時(編譯期間)直接計算出表達式的結果,在生成的代碼中直接用計算結果替換表達式。 這樣就避免了程序在運行時執(zhí)行這些計算花費的成本。

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

  1. int main() { return 7 + 8; } 

首先,關于這篇文章的一些須知:

  1. 我們將從命令行來構建程序(而不是Visual Studio)
  2. 我們會使用Visual Studio 2012。 特別注意的是,這個版本的編譯器會產(chǎn)生x64位代碼(而不是已經(jīng)過時的x86架構)在64位機子上編譯。

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

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

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

  1. PUBLIC  main 
  2. _TEXT   SEGMENT 
  3. main    PROC 
  4.         mov     eax, 15 
  5.         ret     0 
  6. main    ENDP 
  7. _TEXT   ENDS 
  8. END 

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

  1. PUBLIC  main 
  2. _TEXT   SEGMENT 
  3. main    PROC 
  4.         mov     eax, 7 
  5.         add     eax, 8 
  6.         ret     0 
  7. main    ENDP 
  8. _TEXT   ENDS 
  9. END 

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

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

  1. #define SECS_PER_MINUTE  60 
  2. #define MINUTES_PER_HOUR 60 
  3. #define HOURS_PER_DAY    24 
  4.   
  5. enum Event { Started, Stopped, LostData, ParityError }; 
  6.   
  7. struct { 
  8.     int        clock_time; 
  9.     enum Event ev; 
  10.     char*      reason; 
  11. }   Record; 
  12.   
  13. int main() { 
  14.     const int table_size = SECS_PER_MINUTE * MINUTES_PER_HOUR * HOURS_PER_DAY * sizeof Record; 
  15.     // rest of program 

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

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

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

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

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

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

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

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

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

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

我們來看看如果我們使用 cl /FA /O2 App.cpp 來進行優(yōu)化,會發(fā)生什么。

  1. mov eax,10 

后端優(yōu)化器已經(jīng)識別到bump函數(shù)很小,可以包含到調(diào)用者里(我們在后面的章節(jié)將會講到這種優(yōu)化方法,叫做內(nèi)聯(lián)函數(shù))。它在編譯時就能夠估算出整個表達式的值,***只剩下一條單指令。很神奇,對吧?

原文鏈接:http://blogs.msdn.com/b/vcblog/archive/2013/07/04/optimizing-c-code-constant-folding.aspx

譯文鏈接:http://blog.jobbole.com/47191/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2013-09-05 09:50:11

C++代碼優(yōu)化

2024-01-25 16:19:27

2010-01-13 13:27:00

C++優(yōu)化

2013-09-03 09:35:10

2010-02-05 17:49:24

C++常量引用

2020-07-19 10:23:13

C++進制常量

2024-01-25 11:42:00

C++編程指針常量

2023-11-15 17:58:58

C++代碼

2023-10-30 10:29:50

C++最小二乘法

2011-07-12 11:15:46

C++

2021-06-10 09:40:12

C++性能優(yōu)化Linux

2010-01-18 16:17:53

C++代碼

2010-01-14 14:40:21

C++代碼

2011-05-18 18:05:47

C#C++

2013-09-03 09:30:42

C++代碼優(yōu)化

2011-05-18 17:56:38

C#C++

2010-01-14 16:35:31

C++優(yōu)化

2010-01-21 10:23:53

C++代碼

2010-01-22 13:45:36

C++代碼

2010-01-18 13:42:51

C++代碼
點贊
收藏

51CTO技術棧公眾號

欧美一区二区.| 精品国产91久久久久久久妲己| 国产精品第二页| 成人国产精品入口免费视频| 亚洲曰韩产成在线| 97超碰在线人人| 久久国产精品久久w女人spa| 91免费视频国产| 国产91一区| 97视频在线观看视频免费视频 | 欧美一区日韩一区| 免费av网页| 中文字幕一区二区三区在线不卡| 成 年 人 黄 色 大 片大 全| 国产乱对白刺激视频不卡| 一区二区三区视频| 卡一卡二国产精品| av第一福利在线导航| 5g国产欧美日韩视频| 一路向西2在线观看| 巨大黑人极品videos精品| 久久精品日韩| 亚洲午夜电影| 综合久久综合久久| 久草在在线视频| 91久色porny| 日韩欧美猛交xxxxx无码| 免费亚洲电影在线| 欧美日韩电影一区二区| 在线亚洲观看| 欧美一区二区三区四区在线观看地址| 国产精品美女久久久| 亚洲v日韩v欧美v综合| 免费xxxx性欧美18vr| 欧美少妇在线观看| 久久影视一区二区| 成人亚洲一区二区三区| 玉足女爽爽91| 国产乱视频在线观看| 精品999在线播放| 亚洲欧洲自拍| 高清视频欧美一级| 成人精品中文字幕| 蜜桃久久影院| 国产麻豆成人精品| 高清av免费看| 色哟哟欧美精品| 中文在线观看免费| 久久精品视频在线观看| 伊甸园亚洲一区| 国内精品二区| 成人av免费在线| h片免费观看| 51精品国自产在线| 亚洲精品伦理| 91亚洲精华国产精华| 蜜臀久久99精品久久久久宅男 | 羞羞小视频视频| 色综合色狠狠天天综合色| 精精国产xxxx视频在线中文版| 亚洲经典中文字幕| 欧美日韩看看2015永久免费 | 国产女人aaa级久久久级| 天天av综合网| 亚洲精品av在线播放| 福利片一区二区| 亚洲伊人成综合成人网| 精品综合久久久久久8888| 粉嫩虎白女毛片人体| 欧美色手机在线观看| 精品176极品一区| 91超碰在线免费观看| 99国产精品一区| 亚洲图片88| 91精品国产高清自在线| 日本系列欧美系列| 欧美h版电影| 精品亚洲va在线va天堂资源站| 国内黄色精品| 天堂а√在线中文在线| 色综合久久中文综合久久97| 国产精品久久免费视频| 欧美日韩国产综合视频在线| 国产精品高清亚洲| 日韩pacopacomama| 国产精品一区二区在线观看| 久久久99精品久久| 男插女视频久久久| 91久久中文字幕| 国产亚洲成年网址在线观看| 青青青草视频在线| 99久久99久久精品国产片| 国产精品久久久久国产精品日日| 七七久久电影网| 99re国产视频| 亚洲美女免费在线| 99热这里有精品| 伊人狠狠色丁香综合尤物| 亚洲最大成人综合| 亚洲小说春色综合另类电影| 国产树林野战在线播放| 91精品国产综合久久久久久| 婷婷综合网站| 无限国产资源| 亚洲3p在线观看| 91丨九色丨尤物| 欧美最新精品| 欧美日韩一级在线| 日韩美女主播在线视频一区二区三区| 成人av动漫在线观看| 美女少妇一区二区| 久久久成人av| 成人久久18免费网站麻豆 | 日本视频一区在线观看| 狠狠操狠狠色综合网| 欧美精品momsxxx| 性刺激的欧美三级视频| 久久精品国产96久久久香蕉| 国产一区二区三区久久悠悠色av| av毛片在线免费看| 国产自产精品| 欧美日韩午夜精品| 野花国产精品入口| 美女写真理伦片在线看| 国产精选在线观看91| 欧美亚洲国产一区在线观看网站 | 国产专区在线| 成人做爽爽免费视频| 午夜精品久久久久久久久| 国模精品一区| 天堂аⅴ在线最新版在线| 国产97在线播放| 一区二区三区国产精品| 国产一区99| 色在线免费视频| 国产日韩欧美精品| 欧美高清你懂得| 老鸭窝一区二区久久精品| 天堂电影一区| 鲁一鲁一鲁一鲁一澡| 久久久免费精品| 午夜精品影院在线观看| 国产精品地址| av毛片在线免费看| 成人国产一区二区三区| 中文字幕亚洲欧美一区二区三区| 91在线播放网址| 一区二区中文字幕在线观看| 国产视频97| 国产亚洲精品自在久久| 国产视频精品一区二区三区| 国产成人av影院| 免费日韩一区二区三区| 在线看a视频| 久久99国产精品99久久| 亚洲欧美国产视频| 中文字幕成人网| 亚洲欧美伊人| 麻豆网站免费在线观看| 欧美黄色一级片视频| 国产精品女视频| 日韩午夜av电影| 99久久99久久免费精品蜜臀| 欧洲专线二区三区| 麻豆传媒在线免费| 人人干视频在线| 国产精品久久网| 91麻豆精品国产91久久久更新时间| 久久国产欧美日韩精品| 成人av综合网| 91精品国产91久久久久游泳池| 久久久久久久久久久综合| 日本国产高清不卡| 精品国产91久久久久久久妲己 | 91精品91久久久中77777| 蜜臂av日日欢夜夜爽一区| 日韩中文字幕视频网| 欧美在线观看在线观看| 51xx午夜影福利| 国产精品pans私拍| 亚洲福利在线播放| 亚洲图片你懂的| 久久久久久夜| 欧洲亚洲视频| 大桥未久在线视频| 曰韩少妇与小伙激情| 日日噜噜夜夜狠狠久久丁香五月| 国产脚交av在线一区二区| 亚洲另类激情图| 色婷婷久久综合| 国产午夜精品一区二区三区嫩草 | 国产精品毛片大码女人| 99热精品在线| 在线播放一区二区精品视频| 国产精品实拍| 亚洲娇小娇小娇小| 亚洲制服中文| 91香蕉亚洲精品| 欧美成年人视频网站| 精品少妇一区二区三区免费观看|