C++ - 移动 class 的具有固定大小的 c 样式数组成员的构造函数
C++ - Move constructor of class with a fixed size, c-style array member
我有一个固定大小的 class,c 风格的数组成员,类似于 this:
struct some {
static const size_t name_length = 64;
char name[name_length+1];
some() = default;
some(const some& s) {
memcpy(name, s.name, strlen(s.name)+1);
}
// other constructors...
void set_name(const char* s) {
auto len = strlen(s);
if (len > name_length) {
len = name_length;
}
memcpy(name, s, len);
name[len] = '[=11=]';
}
};
复制构造函数工作正常,但是我如何实现移动构造函数?
我知道我可以用 std::array
替换 c 风格的数组,但是如果没有它,有没有办法做到这一点?
P.S.: 很多人建议我使用编译器生成的 copy/move 构造函数...不幸的是,在真正的 class 中,我不能那样做因为这个 class 有其他成员和其他构造函数......我只是想知道是否有办法移动固定大小的成员。我想没有,移动构造函数将不得不只复制字节。我想知道这是否是 std::array
所做的...
how would I implement a move constructor?
这个 class 没有资源,没有指针成员,所以它的移动构造函数和它的复制构造函数是相同的。
此外,您不需要在这里手动定义复制构造函数,编译器生成的复制构造函数会做正确的事 - 成员智能复制:
some(const some& s) = default;
或者,您可以删除两个构造函数。这也将允许您使用聚合初始化语法初始化 class,例如:some s = {"it is something"};
.
由于您的 class 不直接拥有任何资源(也不通过成员间接拥有),请不要浪费时间编写 move-ctor 和/或 move-assignment,这不会获得任何优势:
无论如何,他们必须做与复制变体相同的事情。
此外,编写您自己的自定义复制函数是在浪费时间,因为默认复制函数非常好,而且缺点是 class 变得很复杂。尽管如果你必须要说明,请在-class中明确默认它以保持琐碎。
顺便说一句,请考虑您是否完全需要 0 终止,或者可以使用最大长度的 0 填充序列代替。只比二的幂多一个是相当尴尬的大小。
我有一个固定大小的 class,c 风格的数组成员,类似于 this:
struct some {
static const size_t name_length = 64;
char name[name_length+1];
some() = default;
some(const some& s) {
memcpy(name, s.name, strlen(s.name)+1);
}
// other constructors...
void set_name(const char* s) {
auto len = strlen(s);
if (len > name_length) {
len = name_length;
}
memcpy(name, s, len);
name[len] = '[=11=]';
}
};
复制构造函数工作正常,但是我如何实现移动构造函数?
我知道我可以用 std::array
替换 c 风格的数组,但是如果没有它,有没有办法做到这一点?
P.S.: 很多人建议我使用编译器生成的 copy/move 构造函数...不幸的是,在真正的 class 中,我不能那样做因为这个 class 有其他成员和其他构造函数......我只是想知道是否有办法移动固定大小的成员。我想没有,移动构造函数将不得不只复制字节。我想知道这是否是 std::array
所做的...
how would I implement a move constructor?
这个 class 没有资源,没有指针成员,所以它的移动构造函数和它的复制构造函数是相同的。
此外,您不需要在这里手动定义复制构造函数,编译器生成的复制构造函数会做正确的事 - 成员智能复制:
some(const some& s) = default;
或者,您可以删除两个构造函数。这也将允许您使用聚合初始化语法初始化 class,例如:some s = {"it is something"};
.
由于您的 class 不直接拥有任何资源(也不通过成员间接拥有),请不要浪费时间编写 move-ctor 和/或 move-assignment,这不会获得任何优势:
无论如何,他们必须做与复制变体相同的事情。
此外,编写您自己的自定义复制函数是在浪费时间,因为默认复制函数非常好,而且缺点是 class 变得很复杂。尽管如果你必须要说明,请在-class中明确默认它以保持琐碎。
顺便说一句,请考虑您是否完全需要 0 终止,或者可以使用最大长度的 0 填充序列代替。只比二的幂多一个是相当尴尬的大小。