作者lovejomi (JOMI)
看板C_and_CPP
标题[问题] return by value但用 move有特殊意义吗
时间Wed Jul 31 23:04:17 2019
https://github.com/boostorg/filesystem/commit/701ae4054947b1643eb6cd42f7e172f8
3536b764
因缘际会看到这个patch
他这样写 刻意用 std move 摆在return
但书本上或是网路上查到的都是说
不要这样写 会限制最佳化的发挥空间
但他是boost ,我就想说是不是有什麽特殊考量
相较他 const lhs 版本 ,return local变数 就没特别写 move
难道参数型态是 &&,return若没move就会走copy(我想没这个限制才对)
所以想知道 到底什麽时候要刻意加上move在return value上
另外对於他特别写inline
1. 他实作是写在class内,应该不用特别写inline...有什麽背後原因吗?
2. inline 跟 rvo感觉就有点互斥,为什麽他要特别写inline呢?
看了很不解,怀疑自己有少理解一些观念
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.12.8.46 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1564585460.A.073.html
2F:→ lovejomi: 但我无法解释为什麽 不return move就会变成走copy 08/01 00:41
3F:→ lovejomi: 一直认为return 是一个独特的存在 感觉有不知道的规则. 08/01 00:46
4F:推 KaryuuIssen: 就算是右值参照绑定也是左值 所以要用move转回右值 08/01 01:33
5F:→ KaryuuIssen: 才能实现移动语义 不知道你的问题是不是这个 08/01 01:33
6F:→ loveme00835: zzz 希望你能有系统地学一个语言, 不是网路上东拼西 08/01 01:52
7F:→ loveme00835: 凑, 然後回答了你也吸收不了 08/01 01:52
8F:→ lovejomi: @Kar:我的问题不是这个,是一般return xxx; by value就 08/01 09:54
9F:→ lovejomi: 会走move不需要刻意去std move转型, 但为什麽这种&&的要 08/01 09:54
10F:→ lovejomi: 特别用move才会变成走move呢(我知道他有名字是左值)? 08/01 09:54
11F:→ lovejomi: 想了解细节 谢谢 08/01 09:54
12F:推 eye5002003: 从boost的使用规画去想就可以理解它在做什麽了,通常 08/01 10:36
13F:→ eye5002003: 像c=a/b这种算式是不会去修改a跟b的数据,它们只参与而 08/01 10:38
14F:→ eye5002003: 以,然而当你这麽写的时候c=std::move(a)/b就是允许编 08/01 10:40
15F:→ eye5002003: 译器拿a的资源来用了,return那边不写move的话会建立一 08/01 10:44
16F:→ eye5002003: 个新的副本,这样使用者写的move就失去意义了 08/01 10:46
17F:→ lovejomi: 我好像意识到 平常不写move是因为受惠於nrvo...但这样 08/01 10:51
18F:→ lovejomi: 让我不解 想要nrvo又inline 是怕说inline失败还有nrvo 08/01 10:51
19F:→ lovejomi: 吗 08/01 10:51
20F:推 KaryuuIssen: 上上面问题 因为&& lhs是外来的输入引数 无法NRVO 08/01 15:13
21F:→ KaryuuIssen: 当然能inline最好 NRVO所搞的优化 inline何尝不可 08/01 15:14
22F:→ hunandy14: 我有注意到你更改後的把 path&& 改为 path 了 08/01 17:35
23F:→ hunandy14: 改回来原本 $$ 你不用 std::move 是不合法的 08/01 17:36
24F:→ hunandy14: 阿 不是你改的~没注意看 08/01 17:39
25F:→ Lipraxde: inline 不是因为它放在 header 里吗 08/01 18:51
26F:→ loveme00835: 会跟 inline 混淆表示你根本不知道你在问什麽, move 08/01 19:54
27F:→ loveme00835: 的作用就是转型, 这会决定哪个版本的建构子会被叫起 08/01 19:54
28F:→ loveme00835: 来, 而会不会最终会被 optimize 掉, 则是取决你的函 08/01 19:54
29F:→ loveme00835: 式内容, 不是 return statement. 你每篇问题都是看到 08/01 19:54
30F:→ loveme00835: 一个 feature 就问, 但是最简单的像 move 你就理解错 08/01 19:54
31F:→ loveme00835: 误, 其实後面也不用问了 08/01 19:54
32F:→ loveme00835: 直接跟你说 C++17 以前, 谈 RVO 都是 implementation 08/01 19:55
33F:→ loveme00835: defined 所以先知道自己问题的 scope 别人才有办法 08/01 19:55
34F:→ loveme00835: 回答你 08/01 19:55
35F:推 ofd168: 推楼上好心大神 08/08 02:18