c移动语义澄清

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

void Text::SetText( const std::string& str )
{
    m_str = str;
}

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

void Text::SetText( std::string&& str )
{
    m_str = move( str );
}

有我的问题:

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

谢谢.

最佳答案
你的代码是正确的.但首选的C 11方法是:

void Text::SetText(std::string str)
{
    m_str = move(str);
}

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

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

Does it works with std container? Does they provide move constructor and assignements?

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

Is move semantics usefull when there is not heap allocations is the class ? ( I mean no heap allocation at all, so no smart pointers as class member )

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

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

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

转载注明原文:c移动语义澄清 - 代码日志