大佬教程收集整理的这篇文章主要介绍了c – 何时应该在函数返回值上使用std :: move?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct Foo {}; Foo meh() { return std::move(Foo()); }
我很确定移动是不必要的,因为新创建的Foo将是一个xvalue.
但在这种情况下呢?
struct Foo {}; Foo meh() { Foo foo; //do something,but kNowing that foo can safely be disposed of //but does the compiler necessarily kNow it? //we may have references/pointers to foo. how Could the compiler kNow? return std::move(foo); //so here the move is needed,right? }
我认为需要采取行动吗?
回归foo;是NRVO的案例,因此允许复制省略. foo是一个左值.因此,从foo到meh的返回值选择“复制”的构造函数必须是移动构造函数(如果存在).
但是@L_516_12@move确实会产生一些潜在的影响:它可以防止移动被省略,因为返回std :: move(foo);没有资格获得NRVO.
据我所知,12.8 / 32列出了左移的副本可以被移动替换的唯一条件.一般情况下,编译器不允许在复制后检测左值未使用(比如使用DFA),并自行进行更改.我在这里假设两者之间存在可观察到的差异 – 如果可观察行为相同则应用“假设”规则.
因此,要回答标题中的问题,请在需要移动时使用std :: move返回值,并且无论如何都不会移动它.那是:
>你希望它被移动,并且
>这是一个左值,而且
>它不符合复制条款的条件,并且
>它不是按值函数参数的名称.
考虑到这是非常繁琐而且移动通常很便宜,您可能会说在非模板代码中您可以简化这一点.使用std :: move时:
>你希望它被移动,而且
>你不能担心它.
通过遵循简化的规则,你牺牲了一些移动省略.对于像std :: vector这样的类型,移动成本很低,你可能永远不会注意到(如果你注意到你可以优化).对于像std :: array这样移动成本昂贵的类型,或者对于你不知道移动是否便宜的模板,你更可能会担心它.
以上是大佬教程为你收集整理的c – 何时应该在函数返回值上使用std :: move?全部内容,希望文章能够帮你解决c – 何时应该在函数返回值上使用std :: move?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。