青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

C++回調(diào)函數(shù)(callback)與仿函數(shù)(functor)的異同

C++回調(diào)函數(shù)(callback)與仿函數(shù)(functor)的異同

許式偉 (版權聲明)
2007-3-3

回調(diào)函數(shù)(callback)與仿函數(shù)(functor)很多時候從用途上來看很相似,以致于我們經(jīng)常將它們相提并論。例如:

inline bool compare(int a, int b)
{
   
return a > b;
}
 
struct comparer {
  
bool operator()(int a, int b) const {
     
return a > b;
  }
};
 
void main()
{
   std::vector
<int> vec, vec2;
   std::sort(vec.begin(), vec.end(), compare);
   std::sort(vec2.begin(), vec2.end(), comparer());
}

仿函數(shù)(functor)之所以稱為仿函數(shù),是因為這是一種利用某些類對象支持operator()的特性,來達到模擬函數(shù)調(diào)用效果的技術。

如果這里vec, vec2這兩個vector的內(nèi)容一樣,那么從執(zhí)行結果看,使用回調(diào)函數(shù)compare與使用仿函數(shù)comparer是一樣的。

那么,我們應該用回調(diào),還是用仿函數(shù)?

很多人都說用仿函數(shù)吧,回調(diào)函數(shù)是丑陋的,代碼不太象C++風格。

但其實問題的本質(zhì)不是在代碼風格上,仿函數(shù)與回調(diào)函數(shù)各有利弊,不能一概而論。

仿函數(shù)(functor)的優(yōu)點

我的建議是,如果可以用仿函數(shù)實現(xiàn),那么你應該用仿函數(shù),而不要用回調(diào)。原因在于: 

  • 仿函數(shù)可以不帶痕跡地傳遞上下文參數(shù)。而回調(diào)技術通常使用一個額外的void*參數(shù)傳遞。這也是多數(shù)人認為回調(diào)技術丑陋的原因。
  • 更好的性能。

仿函數(shù)技術可以獲得更好的性能,這點直觀來講比較難以理解。你可能說,回調(diào)函數(shù)申明為inline了,怎么會性能比仿函數(shù)差?我們這里來分析下。我們假設某個函數(shù)func(例如上面的std::sort)調(diào)用中傳遞了一個回調(diào)函數(shù)(如上面的compare),那么可以分為兩種情況:

  • func是內(nèi)聯(lián)函數(shù),并且比較簡單,func調(diào)用最終被展開了,那么其中對回調(diào)函數(shù)的調(diào)用也成為一普通函數(shù)調(diào)用(而不是通過函數(shù)指針的間接調(diào)用),并且如果這個回調(diào)函數(shù)如果簡單,那么也可能同時被展開。在這種情形下,回調(diào)函數(shù)與仿函數(shù)性能相同。
  • func是非內(nèi)聯(lián)函數(shù),或者比較復雜而無法展開(例如上面的std::sort,我們知道它是快速排序,函數(shù)因為存在遞歸而無法展開)。此時回調(diào)函數(shù)作為一個函數(shù)指針傳入,其代碼亦無法展開。而仿函數(shù)則不同。雖然func本身復雜不能展開,但是func函數(shù)中對仿函數(shù)的調(diào)用是編譯器編譯期間就可以確定并進行inline展開的。因此在這種情形下,仿函數(shù)比之于回調(diào)函數(shù),有著更好的性能。并且,這種性能優(yōu)勢有時是一種無可比擬的優(yōu)勢(對于std::sort就是如此,因為元素比較的次數(shù)非常巨大,是否可以進行內(nèi)聯(lián)展開導致了一種雪崩效應)。

仿函數(shù)(functor)不能做的?

話又說回來了,仿函數(shù)并不能完全取代回調(diào)函數(shù)所有的應用場合。例如,我在std::AutoFreeAlloc中使用了回調(diào)函數(shù),而不是仿函數(shù),這是因為AutoFreeAlloc要容納異質(zhì)的析構函數(shù),而不是只支持某一種類的析構。這和模板(template)不能處理在同一個容器中支持異質(zhì)類型,是一個道理。

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1519828

posted on 2007-09-03 15:27 楊粼波 閱讀(381) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费av片| 午夜亚洲福利| 国产精品亚洲产品| 国产精品国产三级国产aⅴ入口| 欧美激情亚洲激情| 国产精品a久久久久| 国产欧美日韩一区二区三区在线观看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久 | 在线观看国产精品淫| 尤物精品在线| 夜夜精品视频一区二区| 欧美在线啊v| 欧美福利精品| 99视频精品在线| 欧美一区=区| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲精品国偷自产在线99热| 99精品欧美一区| 欧美一区影院| 欧美日韩国产一级片| 国产欧美日韩亚洲| 亚洲美女电影在线| 久久久青草青青国产亚洲免观| 亚洲国产精品视频一区| 亚洲欧美自拍偷拍| 欧美日韩123| 亚洲国产精选| 久久精品国产久精国产思思| 99精品热视频| av成人动漫| 国内一区二区三区| 亚洲午夜影视影院在线观看| 免费欧美网站| 午夜精品亚洲| 欧美日韩国产二区| 亚洲国产日韩欧美在线图片| 久久久久久久久综合| 一区二区三区视频在线观看| 嫩草影视亚洲| 激情婷婷欧美| 久久久国产91| 午夜精品视频在线| 国产精品你懂的在线欣赏| 夜夜嗨一区二区| 亚洲国产日韩一区| 男女av一区三区二区色多| 国外精品视频| 久久久久久欧美| 亚洲欧美日韩久久精品 | 欧美片在线播放| …久久精品99久久香蕉国产| 久久国产精品免费一区| 亚洲一区亚洲二区| 国产精品美女午夜av| 亚洲影视在线播放| 亚洲一级黄色| 国产美女搞久久| 久久精彩视频| 欧美一区二区三区免费在线看 | 欧美成人精品在线播放| 亚洲电影免费在线观看| 免费av成人在线| 久久久亚洲高清| 亚洲国产黄色| 亚洲欧洲在线观看| 国产精品成人国产乱一区| 午夜精品久久久久久久99樱桃| 亚洲亚洲精品三区日韩精品在线视频 | 欧美三级日韩三级国产三级 | 亚洲第一成人在线| 欧美大片一区二区| 在线视频日韩| 亚洲欧美日韩天堂| 在线观看日产精品| 亚洲人成亚洲人成在线观看| 欧美丝袜一区二区三区| 欧美一区二区三区视频在线观看 | 久久久久国色av免费看影院| 亚洲国产美国国产综合一区二区| 亚洲国产一区在线| 国产一区二区三区四区老人| 蜜臀99久久精品久久久久久软件| 久久九九国产精品| 亚洲黄一区二区三区| 亚洲免费久久| 国产亚洲综合性久久久影院| 欧美激情偷拍| 国产精品欧美日韩| 久久一综合视频| 欧美日韩一卡| 免费av成人在线| 欧美日韩在线视频观看| 久久精品久久99精品久久| 欧美刺激午夜性久久久久久久| 亚洲欧美成人一区二区在线电影 | 欧美日韩精品系列| 久久亚洲精选| 欧美亚洲成人精品| 欧美高清在线视频观看不卡| 国产精品推荐精品| 欧美国产精品v| 国产伦精品一区二区三区视频黑人| 女同一区二区| 国产精品无码永久免费888| 你懂的视频欧美| 国产情人节一区| 99精品国产高清一区二区| 在线观看欧美日韩国产| 亚洲欧美日韩天堂| 亚洲在线观看免费| 欧美人成在线视频| 欧美大片在线观看| 国产麻豆日韩欧美久久| 9i看片成人免费高清| 亚洲日本va午夜在线影院| 欧美综合第一页| 欧美与黑人午夜性猛交久久久| 欧美欧美天天天天操| 欧美激情亚洲| 亚洲国产另类精品专区| 久久福利资源站| 香蕉久久国产| 国产精品成人一区二区| 亚洲全黄一级网站| 日韩视频免费观看高清在线视频 | 老司机久久99久久精品播放免费| 欧美在线一二三四区| 国产精品激情av在线播放| 日韩午夜免费视频| 99精品国产在热久久婷婷| 免费成人高清| 欧美激情偷拍| 亚洲毛片播放| 欧美日韩国产一中文字不卡| 亚洲日本激情| 99精品黄色片免费大全| 欧美另类人妖| 一本不卡影院| 午夜激情综合网| 国产欧美一区二区三区久久人妖 | 欧美视频免费看| 一区二区三区成人精品| 亚洲欧美一区二区三区极速播放| 亚洲欧美视频在线| 久久精品一区二区三区中文字幕 | 亚洲一级在线| 国产精品s色| 午夜精品999| 另类尿喷潮videofree | 久久se精品一区精品二区| 国产美女诱惑一区二区| 欧美在线观看你懂的| 欧美mv日韩mv国产网站| 99国产麻豆精品| 国产欧美日韩| 久久野战av| 亚洲麻豆国产自偷在线| 亚洲免费在线观看视频| 国产一区欧美日韩| 欧美不卡视频| 亚洲一区二区在线免费观看视频 | 一区二区三区国产盗摄| 欧美伊人久久| 亚洲国产一区视频| 国产精品久久久久久久7电影| 欧美在线视频一区| 亚洲人体1000| 久久久人成影片一区二区三区观看| 亚洲国内精品在线| 国产精品免费观看在线| 久久久欧美一区二区| 日韩视频一区二区三区在线播放免费观看| 亚洲在线播放| 亚洲高清影视| 国产毛片一区二区| 欧美日本国产精品| 久久激情综合网| 中文久久乱码一区二区| 欧美高清在线播放| 欧美在线你懂的| 亚洲视频一区二区| 亚洲成人在线视频播放| 国产精品久久久久久影视| 可以免费看不卡的av网站| 亚洲永久在线| 亚洲黄色在线看| 久久午夜激情| 欧美一区二视频在线免费观看| 亚洲日本欧美天堂| 激情文学综合丁香| 国产欧美 在线欧美| 欧美系列亚洲系列| 欧美黄污视频| 另类天堂av| 久久精品国产v日韩v亚洲| 亚洲伊人一本大道中文字幕| 亚洲精品国产系列| 欧美成人午夜| 麻豆久久久9性大片| 久久久国产亚洲精品|