[问题] return by value但用 move有特殊意义吗

楼主: lovejomi (JOMI)   2019-07-31 23:04:17
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呢?
看了很不解,怀疑自己有少理解一些观念
谢谢
楼主: lovejomi (JOMI)   2019-08-01 00:41:00
https://ideone.com/gjjVLk 针对我的疑惑 做实验但我无法解释为什么 不return move就会变成走copy一直认为return 是一个独特的存在 感觉有不知道的规则.
作者: KaryuuIssen (一闪)   2019-08-01 01:33:00
就算是右值参照绑定也是左值 所以要用move转回右值才能实现移动语义 不知道你的问题是不是这个
作者: loveme00835 (发箍)   2019-08-01 01:52:00
zzz 希望你能有系统地学一个语言, 不是网络上东拼西凑, 然后回答了你也吸收不了
楼主: lovejomi (JOMI)   2019-08-01 09:54:00
@Kar:我的问题不是这个,是一般return xxx; by value就会走move不需要刻意去std move转型, 但为什么这种&&的要特别用move才会变成走move呢(我知道他有名字是左值)?想了解细节 谢谢
作者: eye5002003 (下一夜)   2019-08-01 10:36:00
从boost的使用规画去想就可以理解它在做什么了,通常像c=a/b这种算式是不会去修改a跟b的数据,它们只参与而以,然而当你这么写的时候c=std::move(a)/b就是允许编译器拿a的资源来用了,return那边不写move的话会建立一个新的副本,这样使用者写的move就失去意义了
楼主: lovejomi (JOMI)   2019-08-01 10:51:00
我好像意识到 平常不写move是因为受惠于nrvo...但这样让我不解 想要nrvo又inline 是怕说inline失败还有nrvo吗
作者: KaryuuIssen (一闪)   2019-08-01 15:13:00
上上面问题 因为&& lhs是外来的输入引数 无法NRVO当然能inline最好 NRVO所搞的优化 inline何尝不可
作者: hunandy14 (Charlott.HonG)   2019-08-01 17:35:00
我有注意到你更改后的把 path&& 改为 path 了改回来原本 $$ 你不用 std::move 是不合法的阿 不是你改的~没注意看
作者: Lipraxde (Lipraxde)   2019-08-01 18:51:00
inline 不是因为它放在 header 里吗
作者: loveme00835 (发箍)   2019-08-01 19:54:00
会跟 inline 混淆表示你根本不知道你在问什么, move的作用就是转型, 这会决定哪个版本的建构子会被叫起来, 而会不会最终会被 optimize 掉, 则是取决你的函式内容, 不是 return statement. 你每篇问题都是看到一个 feature 就问, 但是最简单的像 move 你就理解错误, 其实后面也不用问了直接跟你说 C++17 以前, 谈 RVO 都是 implementationdefined 所以先知道自己问题的 scope 别人才有办法回答你
作者: ofd168 (大色狼来袭)   2019-08-08 02:18:00
推楼上好心大神

Links booklink

Contact Us: admin [ a t ] ucptt.com