我有一个包含std::string的Text类。有一个名为SetText的方法,如下所示:
自从这个方法几乎总是被用作参数的右值,我考虑使用移动构造函数。我了解基本原理,但只限于此。因此我进行了测试,并得出结论:另一个类似方法会更好,一旦定义了移动构造函数和移动赋值操作符,就可以获得性能上的提升:
void Text::SetText( const std::string& str )
{
m_str = str;
}
自从这个方法几乎总是被用作参数的右值,我考虑使用移动构造函数。我了解基本原理,但只限于此。因此我进行了测试,并得出结论:另一个类似方法会更好,一旦定义了移动构造函数和移动赋值操作符,就可以获得性能上的提升:
void Text::SetText( std::string&& str )
{
m_str = move( str );
}
以下是我的问题:
- 它是否适用于std容器?它们提供移动构造函数和赋值吗?
- 当类中没有堆分配(我指的是完全没有堆分配,因此没有智能指针作为类成员)时,移动语义是否有用?
谢谢。
std::swap(m_str, str)
呢? - WhozCraigvoid Text::SetText( std::string&& str )
的重载也是正确的。 - TNAstd::string &&
和std::string const &
两种重载,而且得到的好处并不多。 - Jan Hudecoperator=
时,使用std::swap
。但是如果实现一个setter,使用std::swap
不会更好,而在极少数情况下可能比移动赋值运算符更糟糕。 - Jan Hudec