亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 【結(jié)貼】C++標(biāo)準(zhǔn)有沒有規(guī)定"="到底調(diào)用ctor還是copy ctor還是operator=? [打印本頁]

作者: sampher    時(shí)間: 2013-10-15 09:40
標(biāo)題: 【結(jié)貼】C++標(biāo)準(zhǔn)有沒有規(guī)定"="到底調(diào)用ctor還是copy ctor還是operator=?
本帖最后由 sampher 于 2013-10-29 12:51 編輯

我有下面的小程序,測(cè)試函數(shù)Create()的返回值,賦值給G g1=Create()的時(shí)候,到底是調(diào)用了G的ctor還是copy ctor還是operator=.

  1. class G
  2. {
  3. public:
  4.         static int i;
  5.         G()           {cout<<"ctor"<<endl;i+=1;}
  6.         G(const G& rg){cout<<"copy ctor"<<endl;i+=2;}
  7.         G& operator=(const G& rg){cout<<__FUNCTION__<<endl;i+=3;return *this;}
  8. };
  9. int G::i=0;
  10. G Create()
  11. {
  12.         cout<<__FUNCTION__<<" starts"<<endl;
  13.         G obj;
  14.         cout<<__FUNCTION__<<" ends"<<endl;
  15.         return obj;
  16. }
  17. int main(int argc, char* argv[])
  18. {
  19.         G g1=Create();
  20.         cout<<G::i<<endl;
  21.         return 0;
  22. }
復(fù)制代碼
我在VC2012下面測(cè)試,debug版運(yùn)行的時(shí)候輸出:

  1. Create starts
  2. ctor
  3. Create ends
  4. copy ctor
  5. 3
復(fù)制代碼
而Release版輸出:

  1. Create starts
  2. ctor
  3. Create ends
  4. 1
復(fù)制代碼
看起來G g1=Create()這句話,在Debug版下面是Create返回一個(gè)臨時(shí)對(duì)象,調(diào)用拷貝構(gòu)造函數(shù)賦值給g1,然后臨時(shí)對(duì)象消失了。而Release版看起來使用了返回值優(yōu)化的技術(shù),根本沒有拷貝構(gòu)造函數(shù),而是對(duì)返回的臨時(shí)對(duì)象命名為g。
那么,C++標(biāo)準(zhǔn)有沒有規(guī)定"="應(yīng)該調(diào)用拷貝構(gòu)造,還是構(gòu)造,還是operator=呢? 如果沒有規(guī)定的話,Debug版和Release版的行為就可能不同啊,這豈不是隱含的給程序的行為帶來了一些不經(jīng)意的bug?

------------------------------------
【結(jié)貼】第11L的回復(fù)看起來是最好的

回復(fù) 7# cxytz01
as-if rule:  http://en.cppreference.com/w/cpp/language/as_if
里面有這樣一句話:
Copy elision is the only well-defined exception from the as-if rule.
復(fù)制代碼
copy elision: http://en.cppreference.com/w/cpp/language/copy_elision

作者: 井蛙夏蟲    時(shí)間: 2013-10-15 10:08
回復(fù) 1# sampher
effective C++有詳細(xì)的說明

   
作者: cxytz01    時(shí)間: 2013-10-15 10:30
回復(fù) 2# 井蛙夏蟲


條款幾?
作者: cxytz01    時(shí)間: 2013-10-15 12:01
lz你的程序,我在g++上跑(gcc version 4.1.2 20080704 (Red Hat 4.1.2-4) 無論是debug,還是release版本都是沒有copy constructor出現(xiàn),大概是編譯器優(yōu)化了。

請(qǐng)教g++, gcc怎么關(guān)閉優(yōu)化選項(xiàng),我使用了-O0沒用。
聽個(gè)群友說,-O0相當(dāng)于, 有-Wall,和無-Wall的關(guān)系一樣。 不是全部關(guān)閉優(yōu)化選項(xiàng)。

G g1=Create();  // 這句話是不會(huì)調(diào)用operator=(const G &rhs)的,因?yàn)間1都沒有被構(gòu)造出來,是不能進(jìn)行賦值的。
作者: 井蛙夏蟲    時(shí)間: 2013-10-15 12:10
回復(fù) 3# cxytz01
之前只看了個(gè)標(biāo)題,想錯(cuò)了。他這個(gè)應(yīng)當(dāng)是編譯器優(yōu)化了。
google了一下,他這個(gè)應(yīng)當(dāng)是未定義行為。違反了c++ as-if rule。

   
作者: sampher    時(shí)間: 2013-10-15 12:33
井蛙夏蟲 發(fā)表于 2013-10-15 10:08
回復(fù) 1# sampher
effective C++有詳細(xì)的說明


條款幾?
作者: cxytz01    時(shí)間: 2013-10-15 12:48
回復(fù) 5# 井蛙夏蟲

c++ as-if rule  什么意思,能講明白點(diǎn)嗎?

他的代碼看不出問題啊。


   
作者: myworkstation    時(shí)間: 2013-10-15 13:17
回復(fù) 1# sampher


    Release下沒有調(diào)用copy ctor是因?yàn)檫M(jìn)行了返回值優(yōu)化(Return Value Optimization,簡(jiǎn)稱RVO)。
作者: sampher    時(shí)間: 2013-10-15 16:14
myworkstation 發(fā)表于 2013-10-15 13:17
回復(fù) 1# sampher

謝謝。

我都已經(jīng)說了"而Release版看起來使用了返回值優(yōu)化的技術(shù)"。
我的問題是這樣可能導(dǎo)致Debug/Release版本行為不一致。這個(gè)C++標(biāo)準(zhǔn)沒有管嗎?
作者: myworkstation    時(shí)間: 2013-10-15 16:22
本帖最后由 myworkstation 于 2013-10-15 16:23 編輯

回復(fù) 9# sampher


    G g1=Create();這樣的表達(dá)式屬于Explicit Initialization。這樣的表達(dá)式有以下定義:源類型 a = 目的類型(...); 如果源類型和目的類型一致或者目的類型屬于源類型的子類,那么這樣的初始化表達(dá)式不會(huì)調(diào)用copy構(gòu)造函數(shù),除此之外如果右側(cè)的表達(dá)式是個(gè)構(gòu)造函數(shù)那么將會(huì)調(diào)用在調(diào)用構(gòu)造函數(shù)后進(jìn)行可能的轉(zhuǎn)換函數(shù)(這時(shí)將到存在臨時(shí)對(duì)象,進(jìn)而才會(huì)有copy構(gòu)造函數(shù)的調(diào)用,但如果有RVO的話可能會(huì)被優(yōu)化掉),如果沒有合法轉(zhuǎn)換這個(gè)語句是非法的,否則如果是普通函數(shù)并且返回值類型與源類型兼容那么將會(huì)創(chuàng)建一個(gè)臨時(shí)對(duì)象并調(diào)用copy構(gòu)造函數(shù)。
作者: 井蛙夏蟲    時(shí)間: 2013-10-15 16:35
回復(fù) 7# cxytz01
as-if rule:  http://en.cppreference.com/w/cpp/language/as_if
里面有這樣一句話:
  1. Copy elision is the only well-defined exception from the as-if rule.
復(fù)制代碼
copy elision: http://en.cppreference.com/w/cpp/language/copy_elision


   
作者: zyzbill    時(shí)間: 2013-10-15 19:17
編譯器都會(huì)執(zhí)行N-RVO(named return value optimization), 所以這里沒有拷貝發(fā)生。
即使取消RVO, 應(yīng)該是拷貝構(gòu)造因?yàn)槟阍趧?chuàng)造新的g1對(duì)象。
看我在stackoverflow上的答案:http://stackoverflow.com/questio ... n/18157181#18157181
作者: cxytz01    時(shí)間: 2013-10-15 20:57
回復(fù) 12# zyzbill

你是怎么搜的,我也想學(xué)習(xí)下怎么用stackoverflow


   
作者: myworkstation    時(shí)間: 2013-10-16 10:08
回復(fù) 11# 井蛙夏蟲


    這個(gè)問題的重點(diǎn)是顯式初始化而不是as規(guī)則,as規(guī)則是顯式初始化所涉及的一小部分(在需要類型轉(zhuǎn)換時(shí))。
作者: zyzbill    時(shí)間: 2013-10-16 16:11
cxytz01 發(fā)表于 2013-10-15 20:57
回復(fù) 12# zyzbill

你是怎么搜的,我也想學(xué)習(xí)下怎么用stackoverflow


那個(gè)是我在SO上回答的答案  :wink:
作者: w_anthony    時(shí)間: 2013-10-16 16:48
找了以前參與過的帖子,終于找到了,見http://www.72891.cn/thread-1651248-5-1.html的42L。
作者: 幻の上帝    時(shí)間: 2013-10-16 20:02
很明確是copy initialization,調(diào)用copy/move constructor。
至于運(yùn)行省略調(diào)用的情況,ISO C++ 12.8有專門的規(guī)則。



作者: 幻の上帝    時(shí)間: 2013-10-16 20:05
本帖最后由 幻の上帝 于 2013-10-16 20:05 編輯

回復(fù) 14# myworkstation

as-if是指抽象機(jī)語義和實(shí)際實(shí)現(xiàn)的程序在運(yùn)行時(shí)的語義的一致性,涉及被運(yùn)行的所有C++程序,但和這里沒有直接關(guān)系。
這里只是特別指出不適用as-if。





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2