c – 何时应该在函数返回值上使用std :: move?
参见英文答案 >
c++11 Return value optimization or move? ????????????????????????????????????4个
在这种情况下 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? } 我认为需要采取行动吗? 解决方法
在返回std :: move(foo)的情况下;由于12.8 / 32,此举是多余的:
回归foo;是NRVO的案例,因此允许复制省略. foo是一个左值.因此,从foo到meh的返回值选择“复制”的构造函数必须是移动构造函数(如果存在). 但是添加move确实会产生一些潜在的影响:它可以防止移动被省略,因为返回std :: move(foo);没有资格获得NRVO. 据我所知,12.8 / 32列出了左移的副本可以被移动替换的唯一条件.一般情况下,编译器不允许在复制后检测左值未使用(比如使用DFA),并自行进行更改.我在这里假设两者之间存在可观察到的差异 – 如果可观察行为相同则应用“假设”规则. 因此,要回答标题中的问题,请在需要移动时使用std :: move返回值,并且无论如何都不会移动它.那是: >你希望它被移动,并且 考虑到这是非常繁琐而且移动通常很便宜,您可能会说在非模板代码中您可以简化这一点.使用std :: move时: >你希望它被移动,而且 通过遵循简化的规则,你牺牲了一些移动省略.对于像std :: vector这样的类型,移动成本很低,你可能永远不会注意到(如果你注意到你可以优化).对于像std :: array这样移动成本昂贵的类型,或者对于你不知道移动是否便宜的模板,你更可能会担心它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |