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

天秤座的唐風(fēng)

總會(huì)有一個(gè)人需要你的分享~!- 唐風(fēng) -

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  13 隨筆 :: 0 文章 :: 69 評(píng)論 :: 0 Trackbacks

與臨時(shí)對(duì)象的斗爭(zhēng)(上)

作者:唐風(fēng)

原載:www.cnblogs.com/liyiwen

C++ 是一門以效率見長(zhǎng)的語(yǔ)言(雖然近來(lái)越來(lái)越多的人“不齒”談及效率,我深以為不然,在某一次的程序編寫中不對(duì)效率錙銖必較并不意味意味著我們就不應(yīng)該追求更多的更好的做法)。總之吧,相比起其它語(yǔ)言,程序員們?cè)谑?C++ 的時(shí)候會(huì)更加有意識(shí)地去避免沒(méi)有效率的做法。在C++ 的程序中,臨時(shí)對(duì)象的產(chǎn)生就是損及效率的“惡因”之一,因此也產(chǎn)生出一些意思的技術(shù)和優(yōu)化手段,這篇文章里我總結(jié)一下最近在這些方面學(xué)習(xí)的一些收獲:

返回值優(yōu)化(RVO)與具命返回值優(yōu)化(NRVO)

這是一項(xiàng)編譯器做的優(yōu)化,已經(jīng)是一種很常見的優(yōu)化手段了,放狗搜一下可以找到很多的資料,在 MSDN 里也有相關(guān)的說(shuō)明。

返回值優(yōu)化,顧名思義,就是與返回值有關(guān)的優(yōu)化(廢話……),是當(dāng)函數(shù)是按值返回(而不是引用啊、指針啊)時(shí),為了避免產(chǎn)生不必要的臨時(shí)對(duì)象以及值拷貝而進(jìn)行的優(yōu)化。

先看看下面的代碼:

typedef unsigned int UINT32;

class MyCla
{
public:
    MyCla(UINT32 a_size = 10):size(a_size) {
        p = new UINT32[size];        
    }
    MyCla(MyCla const & a_right):size(a_right.size) {
        p = new UINT32[size];
        memcpy(p, a_right.p, size*sizeof(UINT32));
    }
    MyCla const& operator = (MyCla const & a_right) {
        size = a_right.size;
        p = new UINT32[size];
        memcpy(p, a_right.p, size*sizeof(UINT32));
        return *this;
    }
    ~MyCla() {
        delete [] p;
    }
private:
    UINT32 *p;
    UINT32 size;
};

MyCla TestFun() {
    return MyCla();
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyCla a = TestFun();
    
    return 0;
}

TestFun() 函數(shù)返回了一個(gè) MyCla 對(duì)象,而且是按值傳遞的。

在沒(méi)有任何“優(yōu)化”之前,這段代碼的行為也許是這樣的:return MyCla() 這行代碼中,構(gòu)造了一個(gè) MyCla 類的臨時(shí)的無(wú)名對(duì)象(姑且叫它t1),接著把 t1 拷貝到另一塊臨時(shí)對(duì)象 t2(不在棧上),然后函數(shù)保存好 t2 的地址(放在 eax 寄存器中)后返回,TestFun 的棧區(qū)間被“撤消”(這時(shí) t1 也就“沒(méi)有”了,t1 的生存域在 TestFun 中,所以被析構(gòu)了),在 MyCla a = TestFun(); 這一句中,a 利用 t2 的地址,可以找到 t2 進(jìn)行,接著進(jìn)行構(gòu)造。這樣 a 的構(gòu)造過(guò)程就完成了。然后再把 t2 也“干掉”。

可以看到,在這個(gè)過(guò)程中,t1 和 t2 這兩個(gè)臨時(shí)的對(duì)象的存在實(shí)在是很浪費(fèi)的,占用空間不說(shuō),關(guān)鍵是他們都只是為a的構(gòu)造而存在,a構(gòu)造完了之后生命也就終結(jié)了。既然這兩個(gè)臨時(shí)的對(duì)象對(duì)于程序員來(lái)說(shuō)根本就“看不到、摸不著”(匿名對(duì)象嘛,你怎么引用?),于是編譯器干脆在里面做點(diǎn)手腳,不生成它們!怎么做呢?很簡(jiǎn)單,編譯器“偷偷地”在我們寫的fun函數(shù)中增加一個(gè)參數(shù) A&,然后把 a 的地址傳進(jìn)去(注意,這個(gè)時(shí)候 a 的內(nèi)存空間已經(jīng)存在了,但對(duì)象還沒(méi)有被“構(gòu)造”,也就是構(gòu)造函數(shù)還沒(méi)有被調(diào)用),然后在函數(shù)體內(nèi)部,直接用 a 來(lái)代替原來(lái)的“匿名對(duì)象”,在函數(shù)體內(nèi)部就完成 a 的構(gòu)造。這樣,就省下了兩個(gè)臨時(shí)變量的開銷。這就是所謂的“返回值優(yōu)化”~!在 VC7 里,按值返回匿名對(duì)象時(shí),默認(rèn)都是這么做。

上面說(shuō)的是“返回值優(yōu)化(RVO)”,還有一種“具名返回值優(yōu)化(NRVO)”,是對(duì)于按值返回“具名對(duì)象”(就是有名字的變量!)時(shí)的優(yōu)化手段,其實(shí)道理是一樣的,但由于返回的值是具名變量,情況會(huì)復(fù)雜很多,所以,能執(zhí)行優(yōu)化的條件更苛刻,在下面三種情況下(來(lái)自MSDN),NRVO 將一定不起作用:

  1. 不同的返回路徑上返回不同名的對(duì)象(比如if XXX 的時(shí)候返回x,else的時(shí)候返回y)
  2. 引入 EH 狀態(tài)的多個(gè)返回路徑(就算所有的路徑上返回的都是同一個(gè)具名對(duì)象)
  3. 在內(nèi)聯(lián)asm語(yǔ)句中引用了返回的對(duì)象名。

不過(guò)就算 NRVO 不能進(jìn)行,在上面的描述中的 t2 這個(gè)臨時(shí)變量也不會(huì)產(chǎn)生,對(duì)于 VC 的 C++ 編譯器來(lái)說(shuō),只要你寫的程序是把對(duì)象按值返回的,它會(huì)有兩種做法,來(lái)避免 t2 的產(chǎn)生。拿下面這個(gè)程序來(lái)說(shuō)明:

MyCla TestFun2() {
    MyCla x(3);
    return x;
}

一種做法是像 RVO一樣,把作為表達(dá)式中獲取返回值來(lái)進(jìn)行構(gòu)造的變量 a 當(dāng)成一個(gè)引用參數(shù)傳入函數(shù)中,然后在返回語(yǔ)句之前,用要返回的那個(gè)變量來(lái)拷貝構(gòu)造 a,然后再把這個(gè)變量析構(gòu),函數(shù)返回原調(diào)用點(diǎn),a 就構(gòu)造好了。

還有一種方式,是在函數(shù)返回的時(shí)候,不析構(gòu) x ,而直接把 x 的地址放到 exa 寄存器中,返回調(diào)到 TestFun2 的調(diào)用點(diǎn)上,這時(shí),a 可以用 exa 中存著的地址來(lái)進(jìn)行構(gòu)造,a 構(gòu)造完成之后,再析構(gòu)原來(lái)的變量 x !是的,注意到其實(shí)這時(shí),x 的生存域已經(jīng)超出了 TestFun2,但由于這里 x 所在 TestFun2 的棧雖然已經(jīng)無(wú)效,但是并沒(méi)有誰(shuí)去擦寫這塊存,所以 x 其實(shí)還是有效的,當(dāng)然,一切都在匯編的層面,對(duì)于 C++ 語(yǔ)言層面來(lái)講是透明的。

嗯,(具名)返回值引用大約就是這么多,在網(wǎng)上和 MSDN 上還能查到更多的例子和解釋,對(duì)于在多線程下  (N)RVO 需要注意什么,嗯,我完全沒(méi)有多線程的經(jīng)驗(yàn),不敢亂寫誤人子弟……

右值引用與 move 語(yǔ)意

“C++ 中臨時(shí)對(duì)象對(duì)效率產(chǎn)生的影響一直為人所詬病”(網(wǎng)上流傳的說(shuō)法),NRVO 等手段也只有在一定程度上彌補(bǔ)這個(gè)不足(你知道,在很多情況下無(wú)法做優(yōu)化)。在 C++98 確定后的十多年時(shí)間后,“Cpper神圣”們終于給出了另一個(gè)對(duì)付它的法寶——右值引用。

對(duì)于右值引用,目前我所見過(guò)的最好的講解是VC開發(fā)團(tuán)隊(duì)blog中發(fā)布的一篇長(zhǎng)文(看這里),在CPP blog上飄飄白云的博主進(jìn)行了全文翻譯(譯得很棒),建議細(xì)讀三遍!理解里面每一個(gè)例子~這樣至少你在右值引用的認(rèn)識(shí)上就有了良好的基礎(chǔ)了。(嗯,我只讀了兩遍,下面說(shuō)的東西有錯(cuò)誤的話請(qǐng)?jiān)彶⒅赋?:) )

簡(jiǎn)單的說(shuō),在C++中的左值,就是能取地址的表達(dá)式,比如var、++var之類的,右值就不是能取地址的表達(dá)式啦,比如常數(shù) 123、x++、x+y等等。

嗯,我們可以看到,右值常常就代表著臨時(shí)對(duì)象,也就常常意味著“被詬病的浪費(fèi)……”

比如,z = x + y,這里,翻譯得更“低層”一點(diǎn),那么這里將是:

temp = x + y
z = temp

這個(gè)temp是很尷尬的,不用它將無(wú)法實(shí)現(xiàn)正確、良好的 operator + 語(yǔ)意,用它就很難避免臨時(shí)對(duì)象產(chǎn)生的不良開銷。

我們回到上面 RVO 中的程序例子:

MyCla TestFun() {
    return MyCla();
}

看,這里返回的 MyCla(),正是一個(gè)右值(我們就給它取個(gè)名吧,不然不好稱呼它,嗯,還叫 t1 吧)。在函數(shù)返回后,這個(gè) t1 就被析構(gòu),它做的析構(gòu)動(dòng)作就是把原來(lái)申請(qǐng)的內(nèi)存還給系統(tǒng)。想想在這之前,a 在干什么?a 在構(gòu)造的時(shí)候向系統(tǒng)申請(qǐng)了一塊內(nèi)存!一個(gè)申請(qǐng),一個(gè)還回,一來(lái)一回多費(fèi)事啊,如果能直接把 t1 擁有的內(nèi)存給 a ,就不省事了嗎?反正 t1 馬上就要掛了。好,右值引用給了我們這種機(jī)會(huì),我們?yōu)?MyCla 實(shí)現(xiàn)一個(gè) move 語(yǔ)意的拷貝構(gòu)造函數(shù)(不知道什么是 move 拷貝構(gòu)造?回頭看上面鏈接的文章三遍!):

MyCla(MyCla && a_right):size(a_right.size) {
    p = a_right.p;
    a_right.p = NULL;        
}

當(dāng)編譯器探知用于構(gòu)造 a 的是一個(gè)右值時(shí),就調(diào)用這個(gè) move 構(gòu)造函數(shù),然后我們?cè)谶@個(gè)函數(shù)里偷梁換柱,把 t1 的資源竊取過(guò)來(lái)了。這樣,就算不使用 RVO,這個(gè)構(gòu)造的開銷也是非常小的。

那么,對(duì)于像:

MyCla TestFun2() {
    MyCla x(3);
    return x;
}

這樣的情況呢?是的,這里的 x 是一個(gè)左值,不會(huì)調(diào)用 move 構(gòu)造函數(shù)。可是我們知道這個(gè) x 其實(shí)馬上也要掛了,它的資源不給白不給啊對(duì)不對(duì)?所以,我們就想告訴編譯器,您就把它當(dāng)成個(gè)右值吧,怎么告訴它呢?用 std::move 來(lái)實(shí)現(xiàn)這種 move 語(yǔ)意,像下面這樣:

MyCla TestFun2() {
    MyCla x(3);
    return std::move(x);
}
好啦,這樣又能用上 MyCla 的 move 構(gòu)造函數(shù)啦。

總結(jié)一下,作為右值的臨時(shí)對(duì)象,其實(shí)它的存在就是充當(dāng)一個(gè)傳遞的橋梁,一旦表達(dá)式過(guò)了這個(gè)橋,那么這個(gè)臨時(shí)對(duì)象的存在就沒(méi)有意義了,也沒(méi)有人能再用到它(因?yàn)樗莻€(gè)右值,沒(méi)有名字,又不能取地址)。既然如此,一個(gè)無(wú)人問(wèn)津的就要“死”的變量,把它擁的的資源搶過(guò)來(lái)也不算過(guò)份吧……。在 C++0x 之前,我們想這么做,但是沒(méi)有手段,雖然編譯器能分清楚左值右值,但我們無(wú)法通過(guò)程序告訴編譯器,如果這是左值,請(qǐng)用這個(gè)方法,這個(gè)是右值,嘿嘿,那用另一個(gè)方法幫我搶它的資源吧……,。到了 C++0x ,我們有手段了,那就是右值引用,這個(gè)右值引用可以參與函數(shù)的重載,這樣就給了我們機(jī)會(huì),針對(duì)左右值分別提供不同的操作方法(函數(shù))讓編譯器幫我們選擇一個(gè)合適的。

一般來(lái)說(shuō),可能需要注意右值引用的地方有:

當(dāng)我們寫的類里擁有動(dòng)態(tài)申請(qǐng)的資源時(shí),那么總是應(yīng)該提供一個(gè)move構(gòu)造函數(shù),這將會(huì)帶給很多好處,可以讓這個(gè)類的使用者(一般是我們自己函數(shù),或是SDL等庫(kù))利用它來(lái)提升效率。

如果我們寫的函數(shù)需要利用傳入的(含有動(dòng)態(tài)申請(qǐng)資源的)對(duì)象參數(shù)來(lái)構(gòu)造新的變量時(shí),我們可以提供右值引用的重載版本,并在構(gòu)造新對(duì)象時(shí)使用std::move來(lái)竊取臨時(shí)對(duì)象的資源。

右值引用在泛型編程中也有極為重要的作用(它能實(shí)現(xiàn)完美轉(zhuǎn)發(fā)),但和本文沒(méi)多大關(guān)系,就不多說(shuō)了。

總之,右值引用是 C++0x 中非常耀眼的一個(gè)新的語(yǔ)言特性,VC2010已經(jīng)將其列入支持范圍(GCC 本人幾乎沒(méi)用過(guò),沒(méi)了解,不敢妄言[注{ThanksTo OwnWaterloo}:gcc新版本也支持了。 gcc4.4.0 的stl已經(jīng)加上對(duì)move的支持了])。

從實(shí)踐的角度講,它能夠完美地解決 C++ 中長(zhǎng)久以來(lái)為人們所詬病的臨時(shí)對(duì)象的效率問(wèn)題。從語(yǔ)言本身來(lái)講,它健全了 C++ 中引用類型在左值右值方面原先的缺陷,從庫(kù)的設(shè)計(jì)者角度講,它給設(shè)計(jì)者又帶來(lái)了一把利器。而對(duì)于廣大的庫(kù)使用者而言,不動(dòng)一兵一卒便能獲得“免費(fèi)”的效率提升。

牛吧!這個(gè)特性如此重要如此有用,幾乎可以想見在支持右值的編譯器一旦實(shí)用化,就將產(chǎn)生大量的使用右值引用特性代碼和相關(guān)的idioms,也可能會(huì)遇到和這個(gè)相關(guān)的bug,一句話,趁早學(xué)吧,出來(lái)混,總是會(huì)碰上的……。

 

(上篇完,下篇將分析 Expression Template 在消除臨時(shí)變量中的作用,以及對(duì)三種方法進(jìn)行一個(gè)總結(jié))

posted on 2009-12-02 22:11 唐風(fēng) 閱讀(2829) 評(píng)論(15)  編輯 收藏 引用 所屬分類: 語(yǔ)言技術(shù)

評(píng)論

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 22:50 OwnWaterloo
gcc新版本也支持了。 gcc4.4.0 的stl已經(jīng)加上對(duì)move的支持了。

沒(méi)有右值引用,也可以消除很多臨時(shí)變量,只是編程很復(fù)雜……
需要使用一些proxy,用來(lái)"記錄""操作與操作數(shù)",僅僅是"記錄"。
只有當(dāng)出現(xiàn)操作的"接收者"時(shí),操作才被真正執(zhí)行,直接在接收者上進(jìn)行操作了。

當(dāng)然,有move更好,本來(lái)就應(yīng)該是這樣,對(duì)立馬就要消亡的對(duì)象,盜取一些資源是很合理的……
只是不知道c++0x要什么時(shí)候才能流行起來(lái)……

看看現(xiàn)在還有N多用vc6的人…… 無(wú)語(yǔ)……


  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 22:58 OwnWaterloo
lambda,aotu,decltype這些都是很有用的特性,沒(méi)它們有時(shí)候真的是相當(dāng)?shù)牟环奖恪?br>
而且,lambda完全可以很簡(jiǎn)單的純手工模擬一個(gè)。
這種毫無(wú)新意的機(jī)械復(fù)制的事情,本來(lái)就應(yīng)該交給編譯器去做。
編譯器實(shí)現(xiàn)lambda表達(dá)式是不需要花什么力氣的。
只是解析可能會(huì)出現(xiàn)麻煩……

auto、decltype更是容易。
其實(shí)編譯器已經(jīng)實(shí)現(xiàn)了它們,只是沒(méi)有暴露出來(lái)而已。

期待c++0x流行啊……

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 23:17 non
c++0x過(guò)于復(fù)雜,在大的工程上保守派不敢上。。甚至于stl的都要求少用  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 23:18 唐風(fēng)
話說(shuō) VC6 還真有點(diǎn)像 IE6 ,擁有極高的使用率,但又不能完全支持“標(biāo)準(zhǔn)”,呵呵,不過(guò) VC6 可以原諒,畢竟開發(fā)的時(shí)候 C++ 標(biāo)準(zhǔn)還沒(méi)出臺(tái)嘛……

唉,托 D 版的福,我可是每發(fā)布一個(gè)新版本就立即升級(jí)的,呵呵,不過(guò)在公司做項(xiàng)目又沒(méi)辦法了,得聽公司技術(shù)決策者的,呵,而我們公司那個(gè)大牛,MS 習(xí)慣 VC6 ……。

我也很期待 C++0x 呢,對(duì) C++ 很有感情,哈哈

對(duì)于
【沒(méi)有右值引用,也可以消除很多臨時(shí)變量,只是編程很復(fù)雜……】
是啊,但通過(guò)這些途徑,完成了一些“目標(biāo)”之后仍然會(huì)覺(jué)得心中有缺憾,不能用最優(yōu)雅的方式解決問(wèn)題的時(shí)候總會(huì)不舒服,
就像 Expression Template 被開發(fā)出來(lái),我想也是人們想有效率,又想直觀的結(jié)果吧……

PS:
您還真是快啊~~我這才發(fā)布,你就來(lái)了。神仙~  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 23:29 唐風(fēng)
@non
是有聽這么說(shuō)的。
不過(guò)我總覺(jué)得:不鼓勵(lì)或是要求禁用 STL 的組織,肯定得要有牛人實(shí)現(xiàn)一套更合適于他們工程的基本類庫(kù),也許他們只是不想要通用的 STL 實(shí)現(xiàn),但 STL 做的那些事,始終還是需要有“人”來(lái)做的。
  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-02 23:51 OwnWaterloo
@唐風(fēng)
DB是什么???

對(duì)那些保守黨,就任由他們?nèi)グ伞?br>讓他們?cè)谧约旱氖澜缋镒詩(shī)首詷?lè),一次又一次的發(fā)明那屬于自己心中完美輪子。
都復(fù)用別人的,他們還怎么好開口向老板要錢啊?
一定要說(shuō):stl對(duì)我們的項(xiàng)目都是不適合的! —— 以顯得自己的項(xiàng)目很牛逼。
然后追加:所以我們自行開發(fā)了xxx! —— 以顯得自己很牛逼。


  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-03 00:06 唐風(fēng)
@OwnWaterloo
呃,不好意思,我是想說(shuō)“盜版”,呵呵
回想,DB 確實(shí)容易聯(lián)想成 DataBase,那這句話就不好理解了……
It's my fault :)


  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-03 00:27 OwnWaterloo
@唐風(fēng)
機(jī)器上的vs2005和2008是學(xué)校給的…… 據(jù)說(shuō)有個(gè)什么政策,學(xué)校每年只用付3000元就可以使用大量的正版軟件。
不過(guò)…… 我已經(jīng)畢業(yè)了…… 機(jī)器上的還沒(méi)刪…… 繼續(xù)用著……
還去下了一個(gè)vc10精簡(jiǎn)版…… 這肯定是D版了……

據(jù)說(shuō)vc9有免費(fèi)的,不含ide。

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-03 13:36 空明流轉(zhuǎn)
@OwnWaterloo
從2003開始,VS就有Express Edition了,不過(guò)僅用于開發(fā)非商業(yè)授權(quán)的軟件。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-03 16:33 OwnWaterloo
@空明流轉(zhuǎn)
嗯,謝謝~


如果我只是想用VC的編譯器測(cè)試一下可移植性。
但并不發(fā)布VC生成的binary。
這樣可以么?


或者,我開發(fā)的東西使用的是new BSD或者LGPL之類的許可證,可以使用VC express么?

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-03 16:40 OwnWaterloo
@空明流轉(zhuǎn)
上面好像沒(méi)說(shuō)清楚…… 我整理一下……

1. 開發(fā)的軟件使用商業(yè)許可證。
發(fā)布的binary使用的是,比如mingw,生成的。
也發(fā)布源代碼。
但發(fā)布前使用VC express作移植性測(cè)試。
當(dāng)然,還包括VC使用的工程文件也會(huì)發(fā)布。
有VC授權(quán)的人,可以自己使用VC編譯。

這樣算侵權(quán)么?

2. 開發(fā)的軟件使用非商業(yè)許可證,比如new BSD或LGPL
發(fā)布源代碼,VC工程文件。侵權(quán)么?
發(fā)布VC編譯的binary呢?

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-04 12:30 YESHG!
關(guān)于這篇的俺的第一篇回復(fù)呢?這里是不是會(huì)評(píng)論失敗?
  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2009-12-06 22:25 唐風(fēng)
@YESHG!
你也注冊(cè)一個(gè)博客園(或是cppblog)的帳戶唄
對(duì)評(píng)論和回復(fù)有郵件通知,這個(gè)功能挺好用的。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2010-03-08 20:50 Jakcie
寫的不錯(cuò)。
我現(xiàn)在用2005。其實(shí)VC6,里面Bug還是不少。尤其是MFC里面。2010都出了,至少該用2005吧。
免費(fèi)版也有IDE,但沒(méi)有很多高級(jí)功能和資源編輯器。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(上) 2013-02-28 16:51 refugee
MyCla const& operator = (MyCla const & a_right) {
size = a_right.size;
p = new UINT32[size];
memcpy(p, a_right.p, size*sizeof(UINT32));
return *this;
}
這個(gè)賦值重載有點(diǎn)問(wèn)題,一、沒(méi)做自賦值檢查;二、沒(méi)釋放原有空間,內(nèi)存泄露(size一致的可以不釋放,也不用new新空間,直接copy);三、返回值是否有必要用const限制,表達(dá)式(a=b)=c不能成立,雖然這表達(dá)式本身就有點(diǎn)腦殘。  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲欧美日韩国产一区二区| 亚洲国产va精品久久久不卡综合| 这里只有精品电影| 欧美国产在线视频| 久久精品国产免费| 国产一区二区三区久久 | 宅男噜噜噜66一区二区66| 美腿丝袜亚洲色图| 久久国产66| 在线国产欧美| 欧美成人国产一区二区| 久久精品成人| 亚洲高清激情| 亚洲福利电影| 免费在线日韩av| 亚洲精品乱码久久久久久久久 | 亚洲国产一区二区在线| 免费中文日韩| 在线亚洲观看| 亚洲伊人网站| 影视先锋久久| 亚洲激情成人| 欧美午夜精品理论片a级大开眼界| 亚洲视频免费看| 亚洲自拍偷拍一区| 精品不卡一区| 亚洲国产精品久久久久久女王| 欧美精品一区二区三| 亚洲一区二区精品视频| 亚洲精品视频啊美女在线直播| 亚洲国产综合视频在线观看| 欧美久久久久久久久久| 亚洲一区二区av电影| 午夜精品亚洲| 最新日韩中文字幕| 一区二区高清视频| 狠狠做深爱婷婷久久综合一区| 欧美成人免费视频| 欧美视频免费在线| 浪潮色综合久久天堂| 欧美黑人在线播放| 欧美亚洲视频一区二区| 久久露脸国产精品| 亚洲欧美成人网| 久热这里只精品99re8久| 国产精品99久久久久久白浆小说| 午夜精彩视频在线观看不卡| 亚洲国产欧美久久| 亚洲免费在线看| 亚洲精品一区二区三区不| 亚洲男人第一网站| 亚洲精品小视频在线观看| 亚洲欧美综合精品久久成人| 亚洲精品国产无天堂网2021| 亚洲一区二区三区四区在线观看 | 欧美大香线蕉线伊人久久国产精品| 欧美日本一区二区高清播放视频| 欧美在线观看一区二区| 欧美国产成人在线| 久久夜色撩人精品| 国产精品美女久久久久久久 | 亚洲区免费影片| 国产一级揄自揄精品视频| 亚洲精品黄色| 亚洲欧洲另类国产综合| 欧美主播一区二区三区美女 久久精品人 | 欧美午夜欧美| 欧美黄色影院| 韩国成人福利片在线播放| 中文亚洲字幕| 亚洲精品在线电影| 美国三级日本三级久久99| 久久精品综合一区| 国产日韩欧美精品一区| 亚洲一区二区在线| 亚洲自拍偷拍色片视频| 欧美成人免费va影院高清| 久色成人在线| 国产在线麻豆精品观看| 亚洲一级片在线看| 午夜精品网站| 国产精品你懂的在线| 一区二区三区www| 亚洲最新视频在线播放| 欧美成人免费在线视频| 欧美国产极速在线| 91久久久在线| 噜噜噜久久亚洲精品国产品小说| 久久精品一区二区三区不卡| 久久精品在线播放| 亚洲高清不卡| 国产亚洲欧洲一区高清在线观看 | 欧美丝袜第一区| 韩日视频一区| 亚洲七七久久综合桃花剧情介绍| 欧美视频一区二区三区四区 | 一区二区欧美日韩| 国产亚洲福利一区| 亚洲三级免费电影| 国内精品久久久久久影视8| 亚洲黄色av| 国语自产精品视频在线看| 亚洲黄页一区| 激情亚洲网站| 亚洲一区二区三区涩| 亚洲日本欧美天堂| 欧美中文字幕在线播放| 亚洲天堂男人| 欧美aⅴ一区二区三区视频| 久久国产精彩视频| 欧美性大战xxxxx久久久| 欧美激情一区二区三级高清视频| 国产亚洲精品7777| 亚洲视频在线视频| 一本色道久久99精品综合| 久久九九电影| 久久aⅴ国产欧美74aaa| 欧美视频一区二区在线观看| 欧美激情a∨在线视频播放| 国产日韩欧美精品在线| 亚洲一区二区动漫| 在线一区观看| 欧美国产激情二区三区| 欧美a级片网站| 狠狠网亚洲精品| 欧美在线观看视频| 久久er99精品| 国产一区二区三区在线播放免费观看 | 欧美在线网站| 欧美一区二区三区免费观看视频| 欧美日韩国产综合视频在线观看 | 欧美亚洲不卡| 日韩亚洲不卡在线| 妖精视频成人观看www| 欧美高清在线| 亚洲国产精品一区二区www在线 | 国产精品一区在线观看| 这里只有精品视频| 亚洲午夜精品一区二区| 欧美视频免费在线| 亚洲制服av| 久久国产精品亚洲77777| 国产婷婷成人久久av免费高清 | 欧美黄色大片网站| 亚洲美女av网站| 欧美精品乱码久久久久久按摩| 亚洲电影在线免费观看| 亚洲国产欧洲综合997久久| 麻豆精品视频| 亚洲激情综合| 亚洲男人影院| 国产亚洲午夜| 免播放器亚洲| 一区二区冒白浆视频| 亚洲女人天堂成人av在线| 国产乱子伦一区二区三区国色天香| 午夜免费日韩视频| 欧美电影免费| 午夜一区二区三区在线观看| 国产一区999| 欧美韩日高清| 亚洲欧美综合精品久久成人| 免费不卡亚洲欧美| 亚洲深夜福利网站| 国产一区三区三区| 欧美精品久久久久久久| 亚洲欧美日本伦理| 亚洲国产二区| 久久xxxx精品视频| 亚洲免费福利视频| 国产一在线精品一区在线观看| 欧美不卡一区| 欧美一二三区精品| 亚洲毛片在线观看.| 久久精品一区| 亚洲视频国产视频| 亚洲国产成人porn| 国产日韩欧美在线看| 欧美人成网站| 欧美 日韩 国产一区二区在线视频 | 在线一区二区日韩| 你懂的视频一区二区| 午夜精品网站| av成人毛片| 亚洲国产中文字幕在线观看| 国产精品人人做人人爽| 欧美黄色免费网站| 久久久久久久综合日本| 亚洲一区二区三区高清不卡| 亚洲电影免费观看高清| 久久久久国色av免费观看性色| 中日韩美女免费视频网站在线观看| 黄色成人免费网站| 国产视频欧美| 国产欧美日韩一区| 国产精品视频福利| 国产精品免费网站在线观看| 欧美日韩成人一区二区三区| 久久一区二区三区国产精品|