亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c++代碼優化方法總結.htm

?? c語言陷阱與缺陷pdf文檔
?? HTM
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0044)http://www.tongyi.net/develop/C/1050583.html -->
<HTML><HEAD><TITLE>C++代碼優化方法總結</TITLE><LINK href="C++代碼優化方法總結.files/style.css" 
type=text/css rel=stylesheet>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<DIV id=head>
<DIV id=menubox>
<DIV class=hidmenu id=menu>統一教學網-IT知識庫
<SCRIPT language=javascript src=""></SCRIPT>
</DIV></DIV></DIV>
<DIV id=search>
<FORM id=form1 action=/search><INPUT id=key style="FONT-SIZE: 16px" size=40> <INPUT class=btn type=submit value=內容檢索> </FORM></DIV>
<DIV id=MainBox>
<DIV id=path><A href="http://www.tongyi.net/">首頁</A> &gt;&gt; <A 
href="http://www.tongyi.net/develop/index.html">程序開發</A> &gt;&gt; <A 
href="http://www.tongyi.net/develop/C/index.html">C++</A></DIV>
<DIV id=Box>
<DIV id=title>
<H1><STRONG>C++代碼優化方法總結</STRONG></H1>作者:wfwd</DIV>
<DIV id=google_ad>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-4911831409822175";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel ="1609457216";
google_color_border = "FFFFFF";
google_color_link = "000000";
google_color_bg = "FFFFFF";
google_color_text = "CCCCCC";
google_color_url = "CCCCCC";
//--></SCRIPT>

<SCRIPT src="C++代碼優化方法總結.files/show_ads.js" type=text/javascript>
</SCRIPT>
</DIV>
<DIV id=Content>
<P>化是一個非常大的主題,本文并不是去深入探討性能分析理論,算法的效率,況且我也沒有這個能力。我只是想把一些可以簡單的應用到你的C++代碼中的優化技術總結在這里,這樣,當你遇到幾種不同的編程策略的時候,就可以對每種策略的性能進行一個大概的估計。這也是本文的目的之所在。</P>
<P>  一. 優化之前</P>
<P>  在進行優化之前,我們首先應該做的是發現我們代碼的瓶頸(bottleneck)在哪里。然而當你做這件事情的時候切忌從一個debug-version進行推斷,因為debug-version中包含了許多額外的代碼。一個debug-version可執行體要比release-version大出40%。那些額外的代碼都是用來支持調試的,比如說符號的查找。大多數實現都為debug-version和release-version提供了不同的operator 
new以及庫函數。而且,一個release-version的執行體可能已經通過多種途徑進行了優化,包括不必要的臨時對象的消除,循環展開,把對象移入寄存器,內聯等等。</P>
<P>  另外,我們要把調試和優化區分開來,它們是在完成不同的任務。 debug-version 
是用來追捕bugs以及檢查程序是否有邏輯上的問題。release-version則是用來做一些性能上的調整以及進行優化。</P>
<P>  下面就讓我們來看看有哪些代碼優化技術吧:</P>
<P>  二. 聲明的放置</P>
<P>  程序中變量和對象的聲明放在什么位置將會對性能產生顯著影響。同樣,對postfix和prefix運算符的選擇也會影響性能。這一部分我們集中討論四個問題:初始化v.s 
賦值,在程序確實要使用的地方放置聲明,構造函數的初始化列表,prefix v.s postfix運算符。</P>
<P>  (1)請使用初始化而不是賦值</P>
<P>  在C語言中只允許在一個函數體的開頭進行變量的聲明,然而在C++中聲明可以出現在程序的任何位置。這樣做的目的是希望把對象的聲明拖延到確實要使用它的時候再進行。這樣做可以有兩個好處:1. 
確保了對象在它被使用前不會被程序的其他部分惡意修改。如果對象在開頭就被聲明然而卻在20行以后才被使用的話,就不能做這樣的保證。2. 
使我們有機會通過用初始化取代賦值來達到性能的提升,從前聲明只能放在開頭,然而往往開始的時候我們還沒有獲得我們想要的值,因此初始化所帶來的好處就無法被應用。但是現在我們可以在我們獲得了想要的值的時候直接進行初始化,從而省去了一步。注意,或許對于基本類型來說,初始化和賦值之間可能不會有什么差異,但是對于用戶定義的類型來說,二者就會帶來顯著的不同,因為賦值會多進行一次函數調用----operator 
=。因此當我們在賦值和初始化之間進行選擇的話,初始化應該是我們的首選。</P>
<P><BR>(2)把聲明放在合適的位置上</P>
<P>  在一些場合,通過移動聲明到合適的位置所帶來的性能提升應該引起我們足夠的重視。例如:</P>
<P>bool is_C_Needed(); <BR>void use()<BR>{<BR>C c1;<BR>if (is_C_Needed() == 
false)<BR>{<BR>return; //c1 was not needed<BR>} <BR>//use c1 here<BR>return; 
<BR>}</P>
<P>  上面這段代碼中對象c1即使在有可能不使用它的情況下也會被創建,這樣我們就會為它付出不必要的花費,有可能你會說一個對象c1能浪費多少時間,但是如果是這種情況呢:C 
c1[1000];我想就不是說浪費就浪費了。但是我們可以通過移動聲明c1的位置來改變這種情況:</P>
<P>void use()<BR>{<BR>if (is_C_Needed() == false)<BR>{<BR>return; //c1 was not 
needed<BR>} <BR>C c1; //moved from the block''''s beginning<BR>//use c1 
here<BR>return; <BR>}</P>
<P>  怎么樣,程序的性能是不是已經得到很大的改善了呢?因此請仔細分析你的代碼,把聲明放在合適的位置上,它所帶來的好處是你難以想象的。</P>
<P><BR>(3) 初始化列表</P>
<P>  我們都知道,初始化列表一般是用來初始化const或者reference數據成員。但是由于他自身的性質,我們可以通過使用初始化列表來實現性能的提升。我們先來看一段程序:</P>
<P>class Person<BR>{<BR>private:<BR>C c_1;<BR>C c_2;<BR>public:<BR>Person(const 
C&amp; c1, const C&amp; c2 ): c_1(c1), c_2(c2) {}<BR>};</P>
<P>  當然構造函數我們也可以這樣寫:</P>
<P>Person::Person(const C&amp; c1, const C&amp; c2)<BR>{<BR>c_1 = c1; <BR>c_2 = 
c2; <BR>}</P>
<P>  那么究竟二者會帶來什么樣的性能差異呢,要想搞清楚這個問題,我們首先要搞清楚二者是如何執行的,先來看初始化列表:數據成員的聲明操作都是在構造函數執行之前就完成了,在構造函數中往往完成的只是賦值操作,然而初始化列表直接是在數據成員聲明的時候就進行了初始化,因此它只執行了一次copy 
constructor。再來看在構造函數中賦值的情況:首先,在構造函數執行前會通過default 
constructor創建數據成員,然后在構造函數中通過operator 
=進行賦值。因此它就比初始化列表多進行了一次函數調用。性能差異就出來了。但是請注意,如果你的數據成員都是基本類型的話,那么為了程序的可讀性就不要使用初始化列表了,因為編譯器對兩者產生的匯編代碼是相同的。</P>
<P> ?。?)postfix VS prefix 運算符</P>
<P>  prefix運算符++和—比它的postfix版本效率更高,因為當postfix運算符被使用的時候,會需要一個臨時對象來保存改變以前的值。對于基本類型,編譯器會消除這一份額外的拷貝,但是對于用戶定義類型,這似乎是不可能的。因此請你盡可能使用prefix運算符</P>
<P>三. 內聯函數</P>
<P>  內聯函數既能夠去除函數調用所帶來的效率負擔又能夠保留一般函數的優點。然而,內聯函數并不是萬能藥,在一些情況下,它甚至能夠降低程序的性能。因此在使用的時候應該慎重。</P>
<P>  1.我們先來看看內聯函數給我們帶來的好處:從一個用戶的角度來看,內聯函數看起來和普通函數一樣,它可以有參數和返回值,也可以有自己的作用域,然而它卻不會引入一般函數調用所帶來的負擔。另外,它可以比宏更安全更容易調試。</P>
<P>  當然有一點應該意識到,inline 
specifier僅僅是對編譯器的建議,編譯器有權利忽略這個建議。那么編譯器是如何決定函數內聯與否呢?一般情況下關鍵性因素包括函數體的大小,是否有局部對象被聲明,函數的復雜性等等。</P>
<P>  2.那么如果一個函數被聲明為inline但是卻沒有被內聯將會發生什么呢?理論上,當編譯器拒絕內聯一個函數的時候,那個函數會像普通函數一樣被對待,但是還會出現一些其他的問題。例如下面這段代碼:</P>
<P>// filename Time.h<BR>#include<BR>#include<BR>using namespace std;<BR>class 
Time<BR>{<BR>public:<BR>inline void Show() { for (int i = 0; i&lt;10; i++) 
cout&lt; };</P>
<P>  因為成員函數Time::Show()包括一個局部變量和一個for循環,所以編譯器一般拒絕inline,并且把它當作一個普通的成員函數。但是這個包含類聲明的頭文件會被單獨的#include進各個獨立的編譯單元中:</P>
<P>// filename f1.cpp<BR>#include "Time.hj"<BR>void f1()<BR>{<BR>Time 
t1;<BR>t1.Show();<BR>}</P>
<P>// filename f2.cpp<BR>#include "Time.h"<BR>void f2()<BR>{<BR>Time 
t2;<BR>t2.Show();<BR>}<BR>結果編譯器為這個程序生成了兩個相同成員函數的拷貝:</P>
<P>void f1();<BR>void f2();<BR>int main()<BR>{<BR>f1(); <BR>f2();<BR>return 
0;<BR>}</P>
<P>  當程序被鏈接的時候,linker將會面對兩個相同的Time::Show()拷貝,于是函數重定義的連接錯誤發生。但是老一些的C++實現對付這種情況的辦法是通過把一個un-inlined函數當作static來處理。因此每一份函數拷貝僅僅在自己的編譯單元中可見,這樣鏈接錯誤就解決了,但是在程序中卻會留下多份函數拷貝。在這種情況下,程序的性能不但沒有提升,反而增加了編譯和鏈接時間以及最終可執行體的大小。</P>
<P>  但是幸運的是,新的C++標準中關于un-inlined函數的說法已經改變。一個符合標準C++實現應該只生成一份函數拷貝。然而,要想所有的編譯器都支持這一點可能還需要很長時間。</P>
<P>  另外關于內聯函數還有兩個更令人頭疼的問題。第一個問題是該如何進行維護。一個函數開始的時候可能以內聯的形式出現,但是隨著系統的擴展,函數體可能要求添加額外的功能,結果內聯函數就變得不太可能,因此需要把inline 
specifier去除以及把函數體放到一個單獨的源文件中。另一個問題是當內聯函數被應用在代碼庫的時候產生。當內聯函數改變的時候,用戶必須重新編譯他們的代碼以反映這種改變。然而對于一個非內聯函數,用戶僅僅需要重新鏈接就可以了。</P>
<P>  這里想要說的是,內聯函數并不是一個增強性能的靈丹妙藥。只有當函數非常短小的時候它才能得到我們想要的效果,但是如果函數并不是很短而且在很多地方都被調用的話,那么將會使得可執行體的體積增大。最令人煩惱的還是當編譯器拒絕內聯的時候。在老的實現中,結果很不盡人意,雖然在新的實現中有很大的改善,但是仍然還是不那么完善的。一些編譯器能夠足夠的聰明來指出哪些函數可以內聯哪些不能,但是,大多數編譯器就不那么聰明了,因此這就需要我們的經驗來判斷。如果內聯函數不能增強行能,就避免使用它.<BR></P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"></DIV></DIV></DIV>
<SCRIPT src="C++代碼優化方法總結.files/urchin.js" type=text/javascript>
</SCRIPT>

<SCRIPT type=text/javascript>
_uacct = "UA-260914-1";
urchinTracker();
</SCRIPT>
</DIV></BODY></HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久毛片a| 色综合天天综合网天天狠天天| 蜜桃精品在线观看| 国产成人精品综合在线观看 | 亚洲韩国精品一区| 欧美欧美欧美欧美| 日本午夜一区二区| 日韩午夜电影av| 久久国产精品99精品国产| 欧美一区二区三区影视| 韩国视频一区二区| 国产一区二区成人久久免费影院 | 日韩精品视频网站| 成人三级伦理片| 日韩欧美中文字幕一区| 亚洲综合色自拍一区| 国产精品一区二区免费不卡| 欧美一区二区三区的| 亚洲精品免费在线播放| 成人av手机在线观看| 国产丝袜在线精品| 国产经典欧美精品| 久久久久综合网| 韩国精品一区二区| 精品人在线二区三区| 日本中文字幕一区二区有限公司| 欧美羞羞免费网站| 亚洲综合色视频| 在线精品观看国产| 亚洲午夜成aⅴ人片| 色噜噜久久综合| 亚洲欧美成人一区二区三区| 99久久久免费精品国产一区二区| 国产精品国产三级国产普通话三级 | 日本一区二区久久| 国产成人综合精品三级| 国产日韩亚洲欧美综合| 国产成人精品午夜视频免费| 国产欧美日韩在线| 成人91在线观看| 亚洲三级小视频| 欧美在线观看一区二区| 性做久久久久久免费观看欧美| 欧美视频精品在线观看| 免费一级片91| 26uuu亚洲综合色| 欧美国产日韩在线观看| 成人激情校园春色| 亚洲免费三区一区二区| 欧美日韩另类一区| 免费高清在线视频一区·| 精品国产一二三区| 高清免费成人av| 一区二区三区日韩欧美精品| 欧美日韩精品欧美日韩精品一综合| 亚洲一级二级在线| 日韩精品一区二区三区在线| 国产一区二区三区四| 亚洲乱码日产精品bd| 69精品人人人人| 国产成人一区二区精品非洲| 亚洲三级小视频| 日韩欧美自拍偷拍| 99久久久国产精品| 午夜精品久久久久久久蜜桃app| 日韩美女一区二区三区| 成人av网站在线观看| 日本成人中文字幕在线视频 | 亚洲一区二区视频在线观看| 欧美一二三四在线| 99久久婷婷国产精品综合| 日韩av电影免费观看高清完整版 | 亚洲无人区一区| 2017欧美狠狠色| 欧洲一区二区三区在线| 精品一区二区三区视频| 亚洲视频小说图片| 精品伦理精品一区| 欧美性猛交一区二区三区精品| 国产一区啦啦啦在线观看| 综合亚洲深深色噜噜狠狠网站| 日韩一区二区三| 一道本成人在线| 精品一区二区三区不卡| 亚洲自拍偷拍综合| 18欧美亚洲精品| 久久综合九色欧美综合狠狠| 色狠狠桃花综合| 国产91精品免费| 韩日欧美一区二区三区| 亚洲午夜羞羞片| 亚洲视频一区在线观看| 国产日产亚洲精品系列| 国产欧美精品在线观看| 日韩午夜精品视频| 欧美日韩国产中文| 一本色道综合亚洲| eeuss鲁片一区二区三区| 国产一区二区三区香蕉| 青青草91视频| 亚洲不卡一区二区三区| 一区二区三区蜜桃网| 国产精品欧美久久久久一区二区 | 国产精品一二三四五| 国产精品电影一区二区三区| 欧美日韩午夜在线视频| 99久久精品国产导航| 色狠狠av一区二区三区| 99久久国产综合精品女不卡| 成人黄色在线看| 91久久精品午夜一区二区| 在线观看视频一区二区| 欧美美女一区二区三区| 欧美一区三区四区| 久久男人中文字幕资源站| 国产三级欧美三级| 亚洲女厕所小便bbb| 亚洲午夜免费视频| 成人午夜视频在线观看| 色综合色狠狠综合色| 欧美乱妇15p| 国产亚洲一区二区在线观看| 欧美三级视频在线观看| 欧美亚洲一区二区在线| 成人永久免费视频| 91蜜桃传媒精品久久久一区二区 | 国产成人99久久亚洲综合精品| 337p粉嫩大胆噜噜噜噜噜91av| 91老司机福利 在线| 91久久国产最好的精华液| 欧亚一区二区三区| 久久尤物电影视频在线观看| 亚洲视频免费在线观看| 久久草av在线| 欧美在线一二三四区| 精品剧情在线观看| 亚洲一区二区不卡免费| 福利一区在线观看| 精品久久久久久久久久久久久久久| 亚洲精品国产a| 国产成人av电影在线观看| 欧美一区二区三区四区视频| 一区二区三区精品视频在线| 国产成人免费在线| 91精品国产综合久久小美女| 一区二区三区在线看| 丁香婷婷综合五月| 久久这里只有精品首页| 视频一区欧美日韩| 欧美伊人久久久久久午夜久久久久| 国产精品欧美精品| 国内偷窥港台综合视频在线播放| 欧美精品第一页| 一区二区三区国产豹纹内裤在线| 成人性生交大片| 日韩美一区二区三区| 视频一区中文字幕| 8v天堂国产在线一区二区| 亚洲一区在线观看网站| 一本色道久久综合亚洲91| 中文字幕一区二区三区av| 成a人片亚洲日本久久| 国产人久久人人人人爽| 国内一区二区在线| 国产亚洲福利社区一区| 国产精品中文有码| 国产亚洲综合av| 国产精品综合av一区二区国产馆| 久久久美女艺术照精彩视频福利播放| 国产91露脸合集magnet | 久久99国产精品免费网站| 欧美一级片在线| 日韩成人精品在线观看| 欧美精品 国产精品| 日韩av一区二区在线影视| 欧美成人伊人久久综合网| 老司机免费视频一区二区三区| 日韩视频一区二区三区在线播放| 免费精品视频在线| 久久你懂得1024| 懂色av一区二区在线播放| 综合久久给合久久狠狠狠97色 | 欧美日韩亚州综合| 视频一区视频二区在线观看| 欧美一区二区三区视频| 国内精品国产三级国产a久久| 26uuu亚洲综合色| 成人国产精品视频| 欧美一区二区精美| 激情五月婷婷综合网| 国产精品色哟哟网站| 欧洲av在线精品| 日韩av在线免费观看不卡| 精品99一区二区三区| 波多野结衣一区二区三区| 伊人开心综合网| 精品久久久久久久久久久久包黑料 | 色综合婷婷久久| 午夜伊人狠狠久久| 久久久91精品国产一区二区三区|