如何解决这是使用std :: move的正确方法吗?
我正尝试在下面的代码段中保存char[10]
的副本,只是想知道这是否是使用std::move
的正确方法,因此实际上会保存{ {1}}与char[10]
对象一起构造。
Struct2
如果我不想重复复制#include <string>
#include <iostream>
#include <cstring>
#include <memory>
using namespace std;
struct Struct1 {
int a;
string b;
char c[10];
};
struct Struct2 {
const Struct1 struct1;
int d;
string e;
};
int main() {
int a = 10;
auto b = "b";
char c[10] = "12345";
Struct1 struct1{a,b};
strcpy(struct1.c,c);
Struct2 str2{std::move(struct1),10,"e"}; //<-- no copy of struct1.c,right?
cout << str2.struct1.c << endl;
}
两次(char[10]
除了用作Struct1
的字段,就不要在结构Struct2中使用更好的语法吗?
解决方法
C数组具有与移动和复制相同的语义。换句话说,C数组的副本和移动完全相同。
优势将体现在ng-model
上,例如成员std::string
。
是的,这是Struct1::b
的正确语法/用法。
如果使用调试器查看变量,则可以看到唯一移动的实体是非POD(“普通旧数据”)字符串b
。在搬家之前,您需要:
您将看到'b'字符串 data 已被复制到新的存储位置,旧的位置已被删除,但其原始缓冲区仍为0x00edfe40
就像其他人所说的那样,std::move
更加关心所有权的转移,确保不保留副本,而不仅仅是避免在本质上复制内存。
以下是建议,而不是污染我之前的答案:
如果要使用unique_ptr,请尝试类似的操作。不幸的是make_unique
在初始化列表中不能很好地发挥作用,因此您必须定义一个非默认构造函数(除非那里的任何人都知道解决方法?)。
class Struct1
{
public:
int a;
string b;
char c[10];
Struct1::Struct1(int _a,string const&& _b,char const* _c) : a(_a),b(_b)
{
strcpy_s(c,10,_c);
}
};
using Struct1_unique = std::unique_ptr<Struct1>;
typedef struct
{
Struct1_unique pStruc1;
// const Struct1 struct1;
int d;
string e;
}
tsStruct2;
int main() {
int a = 10;
auto b = "b";
char c[10] = "12345";
//Struct1 struct1{ a,b };
Struct1_unique pStruc1 = std::make_unique<Struct1>(a,b,c);
//strcpy_s(pStruc1->c,c);
tsStruct2 str2{ std::move(pStruc1),"e" };
cout << str2.pStruc1->c << endl;
str2.pStruc1.reset();
}
及之后:
您可以看到对象的所有权已经转移(pStruc1现在为“空”),没有进行任何复制;指向对象的指针和其中的字符串数据未更改。最后的reset
会取消分配对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。