C++ 移动语义说明

标签 c++ c++11

我有一个包含 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 容器吗?他们是否提供移动构造函数和赋值?
  • 当类没有堆分配时,移动语义是否有用? (我的意思是根本没有堆分配,所以没有智能指针作为类成员)

谢谢。

最佳答案

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

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

也就是说,按值传递并从中移动。

如果您传递一个右值和一个拷贝,这将对 moves 起作用;如果您传递一个左值,这将对 moves 起作用,在后一种情况下,一个拷贝是必需的。

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 )

除了少数使用其他类型资源的情况,没有。

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

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

关于C++ 移动语义说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25053662/

相关文章:

c++ - 为什么使用 auto 的直接列表初始化被认为是不好的或不受欢迎的?

c++ - 如何创建过滤流的成员 vector ?

c++ - std::make_pair 与 C++11 统一初始值设定项

c++ - 将参数传递给 C++ 中的无操作宏

c++ - 将指针分配给函数中的不同地址

c++ - 条件运算符的局限性? :

c++ - 如何像内置类型一样提升两个模板类型进行算术运算呢?

c++ - 调用 SDL_SetVideoMode 时出现段错误

c++ - 在 C++ 中初始化静态 std::map<int, STRUCTURE>

c++ - 将 std::forward 与非转发的普通旧引用一起使用