c++ - 我应该总是在构造函数中使用 std::move 吗?

标签 c++ c++11 move-semantics

示例 A 中使用的 move 语义是否必要,哪个结构更好?

示例 A:

struct A
{
    std::string a;
    A( std::string a ) : a( std::move(a) ){ }
};

示例 B:

struct B
{
    std::string b;
    B( const std::string& b ) : b( b ){ }
};

我不认为这是一个重复的问题。从在类构造函数中使用成员初始化的角度来看,我具体询问哪个示例更好。其他问题中列出的示例或答案均未涉及成员初始化。

我不喜欢使用引用参数调用构造函数,然后将其复制到成员中。似乎有多个复制操作可能会很浪费。

我想尽可能有效地将数据“管道”到成员中,但我不想将右值作为构造函数参数。

最佳答案

结构 A 更优越。

move 对象通常非常便宜(并且通常可以完全优化掉),因此通常不应该关心 move 次数。但重要的是要尽量减少拷贝的数量。示例A中的拷贝数等于或小于示例B中的拷贝数。

更具体地说,如果原始字符串是 L 值,则 A 和 B 是等价的:

std::string s;
...
A a(s);  // one copy
B b(s);  // one copy

但是当原始字符串是 R 值时 A 更好:

std::string MakeString();
...
A a(MakeString());  // zero copies
B b(MakeString());  // one copy

关于c++ - 我应该总是在构造函数中使用 std::move 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43196826/

相关文章:

c++ - 使用 promise 数组的段错误

c++ - 在 std 算法中使用 std::move_iterator 并以 lambda 作为 pred 是否安全

c++ - C++中的临时对象在哪里分配?

c++ - 排列可 move 结构

c++ - 静态成员变量的构造函数和析构函数(指针)

c++ - 有没有办法强制 Protocol Buffer 使用恒定的字段大小?

c++ - 两个整数的幂

c++ - 为什么传递给模板函数的 std::string 对象不喜欢 std::string 重载?

c++ - 折叠复制和 move 语义的重载

c++ - 传递按值返回 vector 的函数作为 ublas::element_prod() 的参数有什么问题?