c++移动语义澄清

c++ move semantics clarification

本文关键字:语义 移动 c++      更新时间:2023-10-16

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

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

由于该方法几乎总是以右值作为参数调用,因此我考虑了move构造函数。我知道基本的,但仅此而已。所以我做了测试,得出的结论是,另一个这样的函数会更好,一旦定义了move构造函数和move赋值,可能会有性能提升:

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

这是我的问题:

  • 它是否与std容器一起工作?它们提供move构造函数和赋值吗?
  • 移动语义有用时,没有堆分配是类?(我的意思是根本没有堆分配,所以没有智能指针作为类成员)

谢谢。

代码是正确的。但首选的c++ 11方法是:

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

也就是说,通过传递,然后从它移动。

如果传递右值并复制一次,则执行一次移动,如果传递左值则需要复制一次,则执行一次移动。

是否适用于std容器?它们提供move构造函数和赋值吗?

是的,标准库为所有类提供了move构造函数和move赋值,这比copy更有效。

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

除了少数其他类型的资源,没有。

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

还需要注意的是,如果你使函数内联,编译器应该能够省略右值情况下的一次移动。它不能在左值的情况下省略它,除非operator=也被内联,因为它不允许用复制赋值替换移动赋值。