请教一个 G++在 C++98 下为什么把 move semantics 模仿的这么熟练的问题

2017-11-28 17:47:31 +08:00
 YyYyYyy



为什么会变成这样呢......明明用的不是 C++11。明明已经关了 copy elision。两件快乐事情重合在一起。而这两份快乐,又给我带来了更多的快乐。得到的,本该是两个不同的地址......但是,为什么,会变成这样呢......

gcc 版本 6.4.0
2680 次点击
所在节点    C
24 条回复
ccsexyz
2017-11-29 00:01:12 +08:00
我认为是这样的,这里 v = func() 有两次拷贝构造函数 vector(const vector &)。
func:v --> tmp:v 拷贝构造 --> func:v 析构 --> main:v 拷贝构造(分配的存储区域刚好和 func:v 存储区域一致) --> tmp:v 析构
LPeJuN6lLsS9
2017-11-29 00:08:14 +08:00
@noli 就是想反驳一下你说的不满足 nrvo。楼主那是咋回事我还没去想

用 msvc2017 开 release 模式做了个简单实验,也是这样调用了一个方法后才返回,确实没有移动和复制构造。

为啥会觉得危险呢,我觉得 nrvo 大前提是一个自动变量,这就很安全了
lrxiao
2017-11-29 02:17:25 +08:00
NRVO 关不掉
符合 NRVO
但是 asm 是正常的调用两次 copy ctor fun 中和 main 中 data()最后同一地址 但是临时对象不是
gnaggnoyil
2017-11-29 05:49:19 +08:00
C++98 我不熟,不过我想提醒那些说 NRVO 的人,`std::vector<int> v=fun()`还需要一次构造过程呢.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/410258

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX