【发布时间】:2016-02-22 10:08:13
【问题描述】:
假设我有 struct Foo 和 move constructor 和 operator=(Foo&&),我用它作为数据成员:
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
万一(2)我其实不需要std::move,
但是如果我在这里使用它会不会造成不好的影响,
比如阻止优化?
我读到这个:Why does std::move prevent RVO?
并发现将return foo; 更改为return std::move(foo); 会导致RVO 禁用,但是(2) 会导致类似的情况吗?如果是这样,为什么?
【问题讨论】:
-
复制省略无论如何都不适用于这种情况,因为您正在调用
foo.operator=。如果你有Foo foo = std::move(f());这是初始化,这将是相关的。 -
@M.M 但是
clang 3.7对此发出警告,所以我想知道是警告生成中的错误,还是我错过了什么 -
它也可能因为非性能原因而变得糟糕。在你的#2 的情况下,你关心在已经是 rhr 的东西上调用 std::move(f()) ,所以移动是浪费字符。我的经验法则是你应该避免使用 std::move ,除非你必须这样做,而且只有在你以非平凡的方式转移所有权时才需要这样做。
-
据我所知,
std::move的正确方法是在将数据传输到子程序时使用它,而不是从。但我也在等待答案;) -
@Galik 你是对的,但如果 2 是明确告诉编译器移动的“坏”方法吗? (虽然它已经准备好移动了),如果是这样,为什么会不好?
标签: c++ c++11 move-semantics rvo