是否应该将std :: move用于返回语句以提高效率?

Cod*_*wer 9 c++ move-semantics c++11

我无法弄清楚以下代码中的std :: move是否有什么好处或完全错误?该类Object同时定义了Move和Copy构造函数.

第一:使用Move:

template<typename T> template <typename F> 
const Object<T> Object<T>::operator*(const F& rhs) const 
{
    return std::move(Object(*this) *= rhs);  // We end in move constructor
}
Run Code Online (Sandbox Code Playgroud)

第二:没有移动:

template<typename T> template <typename F> 
const Object<T> Object<T>::operator*(const F& rhs) const 
{
    return Object(*this) *= rhs; // We end in copy constructor
}
Run Code Online (Sandbox Code Playgroud)

*=操作者被定义为:

template<typename T> template<typename F>  
Object<T>& Object<T>::operator*=(const F& rhs) 
{
    for(int i = 0; i < dimension ; i++)
    {
        _inner[i] *= rhs;
    }
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

这是我用来测试它的代码:

Object<double> test(4);
Object<double> test2(test * 4);
std::cout << test2; // works fine
Run Code Online (Sandbox Code Playgroud)

结果 在第一种情况下,我们在移动构造函数中结束,在第二种情况下,我们在复制构造函数中结束.

无论哪种情况,代码都会编译.

是否比另一个更有效,因为我认为将新对象移出而不是将其复制出来更快?

附加信息: 我使用以下编译器:g ++(Ubuntu/Linaro 4.7.3-1ubuntu1)4.7.3

Mik*_*our 15

是否比另一个更有效,因为我认为将新对象移出而不是将其复制出来更快?

是的,std::move假设对象移动语义比复制更有效,那么在这里使用会更有效率.

通常,在返回临时变量或局部变量时,将自动使用移动语义.但是,在这种情况下,您不是直接返回临时,而是返回由返回的左值引用operator*=.由于不会移动左值,因此std::move在这种情况下您需要将其转换为右值.

但是,您不应返回const值,因为这会阻止返回值用于移动初始化(或移动 - 分配)另一个对象.您的示例将test2通过复制返回值进行初始化,但可能会省略该副本.

或者,您可以使用局部变量实现它:

template<typename T> template <typename F> 
Object<T> Object<T>::operator*(const F& rhs) const 
{
    Object lhs(*this);
    lhs *= rhs;
    return lhs;
}
Run Code Online (Sandbox Code Playgroud)

不仅可以移动返回值,而且可以省略移动本身.