c ++移动语义澄清

Aul*_*ulz 4 c++ c++11

我有一个包含std :: string的Text类.一个方法SetText如下:

void Text::SetText( const std::string& str )
{
    m_str = str;
}
Run Code Online (Sandbox Code Playgroud)

因为这个方法几乎总是以rvalues作为参数调用,所以我想到了移动构造函数.我理解基础知识,但这就是全部.所以我做了测试并得出结论,像这样的另一个函数会更好,一旦定义了移动构造函数和移动分配,就可以获得性能提升:

void Text::SetText( std::string&& str )
{
    m_str = move( str );
}
Run Code Online (Sandbox Code Playgroud)

有我的问题:

  • 它适用于标准容器吗?他们是否提供移动构造和分配?
  • 当没有堆分配时,移动语义是否有用?(我的意思是根本没有堆分配,所以没有智能指针作为类成员)

谢谢.

Jan*_*dec 7

你的代码是正确的.但首选的C++ 11方法是:

void Text::SetText(std::string str)
{
    m_str = move(str);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,传递价值并从中移动.

如果你传递一个右边的一个副本和一个移动,如果你传递左值,那么这将移动,在后一种情况下需要一个副本.

它适用于标准容器吗?他们是否提供移动构造和分配?

是的,标准库为所有类提供移动构造函数和移动赋值,使其比复制更有效.

当没有堆分配时,移动语义是否有用?(我的意思是根本没有堆分配,所以没有智能指针作为类成员)

除了一些其他资源的情况,没有.

如果对象的所有数据都直接存储在对象中,则必须复制它们,并且没有其他工作可以通过移动来保存.

另请注意,如果您使函数内联,编译器应该能够忽略rvalue情况中的一个移动.除非operator=也是内联的,否则它将无法在左值的情况下忽略它,因为它不允许用复制赋值替换移动的赋值.