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

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6742 | 回復(fù): 17
打印 上一主題 下一主題

[C++] 【結(jié)貼】C++標(biāo)準(zhǔn)有沒有規(guī)定"="到底調(diào)用ctor還是copy ctor還是operator=? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-10-15 09:40 |只看該作者 |倒序?yàn)g覽
本帖最后由 sampher 于 2013-10-29 12:51 編輯

我有下面的小程序,測試函數(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下面測試,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

論壇徽章:
4
白羊座
日期:2013-09-17 21:59:30技術(shù)圖書徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40雙子座
日期:2013-12-17 18:26:39
2 [報(bào)告]
發(fā)表于 2013-10-15 10:08 |只看該作者
回復(fù) 1# sampher
effective C++有詳細(xì)的說明

   

論壇徽章:
7
天蝎座
日期:2013-09-28 10:45:42雙子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32處女座
日期:2014-09-17 16:44:332015年亞洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16賽季CBA聯(lián)賽之山東
日期:2018-03-02 23:59:31
3 [報(bào)告]
發(fā)表于 2013-10-15 10:30 |只看該作者
回復(fù) 2# 井蛙夏蟲


條款幾?

論壇徽章:
7
天蝎座
日期:2013-09-28 10:45:42雙子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32處女座
日期:2014-09-17 16:44:332015年亞洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16賽季CBA聯(lián)賽之山東
日期:2018-03-02 23:59:31
4 [報(bào)告]
發(fā)表于 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)行賦值的。

論壇徽章:
4
白羊座
日期:2013-09-17 21:59:30技術(shù)圖書徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40雙子座
日期:2013-12-17 18:26:39
5 [報(bào)告]
發(fā)表于 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。

   

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-10-15 12:33 |只看該作者
井蛙夏蟲 發(fā)表于 2013-10-15 10:08
回復(fù) 1# sampher
effective C++有詳細(xì)的說明


條款幾?

論壇徽章:
7
天蝎座
日期:2013-09-28 10:45:42雙子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32處女座
日期:2014-09-17 16:44:332015年亞洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16賽季CBA聯(lián)賽之山東
日期:2018-03-02 23:59:31
7 [報(bào)告]
發(fā)表于 2013-10-15 12:48 |只看該作者
回復(fù) 5# 井蛙夏蟲

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

他的代碼看不出問題啊。


   

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
8 [報(bào)告]
發(fā)表于 2013-10-15 13:17 |只看該作者
回復(fù) 1# sampher


    Release下沒有調(diào)用copy ctor是因?yàn)檫M(jìn)行了返回值優(yōu)化(Return Value Optimization,簡稱RVO)。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 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)沒有管嗎?

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [報(bào)告]
發(fā)表于 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ù)。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP