作者tomap41017 (绝梦)
看板EE_DSnP
标题Re: [问题] Copy Constructor
时间Thu Oct 14 23:04:57 2010
很好,我昨天在课堂上跟你做一样的事,
也发现这个问题,後来就困扰我到晚上= =a
这边给你一个我在网上搜寻到的资料,是某个网友的部落格,
不过我为了方便以及资料整理,把他下载做成PDF档(有标重点以及程式码使用consolas)
需要的人可以自行下载来看看,文章一开始就有原文连结了。
关於(N)RVO
http://ppt.cc/rxM2
我後来还发现这跟我对於function的回传值会有一些误解有关,
为了避免大家有相同困扰,跟大家说明一下好了XD
譬如说在InputMatrix()的return type是Matrix,
而在最後一行会有return m;
应该把它看成是,当函示结束时,因为return type是Matrix,
所以在外面会建立一个暂时物件Matrix temp(m):此暂时物件的内容是以m当参数传入
呼叫其copy constructor,
而你用Martxi m1 = InputMatrix();时
在m1的 construct call应该是Matrix m1(temp);
所以一共会有两次的copy constructor call。
但是NRVO帮我们消去这两个copy constructor call,所以你不会看到有输出XDD
这真的蛮黑暗的拉,毕竟很多书上都不太会(或很少)提到这件事情,
而我们也习惯性忽略,等到真的有使用到时才会去注意到这件事。
提供给有需要的同学参考:)
※ 引述《occqoo (小欧)》之铭言:
: 在写作业1.2 P2的时候愈到了一点小问题
: 本来想说检查一下自己的code
: 就用cout大法(老师不要杀我)在Matrix的copy constuctor中
: 加上了cout<<"Matrix copy";
: 结果在执行hw1.2.p2.cpp中的
: Matrix m1 = InputMatrix()
: 发现并没有Matrix copy这行输出
: 用ddd检查发现copy constructor真的没有被呼叫到
: 跟上课时讲得好像有点不同(还是我搞错了)
: 进一步检查发现destructor也一样没有被呼叫过
: 稍微Google了一下
: 好像有人说g++在这种function return的情况下会自动作优化
: 并不会真的去呼叫我们写的copy constructor
: 不知道版上有没有强者知道实际状况
: 不然好像自己写得code都没有被执行的样子
: 感谢大家或老师帮忙解答喽~
: p.s 2732篇都没有人回答我
(上面一 行不小心删到了,抱歉)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.244.171