c++移动语义澄清
c++ move semantics clarification
我有一个包含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=
也被内联,因为它不允许用复制赋值替换移动赋值。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 视觉理解移动C++标准的语义
- 如何通过move语义移动多个参数