【 在 z16166 的大作中提到: 】
: 标 题: Re: c++真是快被标准委员会玩成花了啊
: 发信站: 水木社区 (Thu Aug 18 14:31:21 2022), 站内
:
: 举一个场景:
:
: 有一个结构,我们要parse一些json数据,用parse出来的数据填充这个结构的各个字段,
: 然后把这个结构插入到表里(map/set/vector里)
:
: struct MyStruct {
: m1;
: m2;
: m3;
: };
:
: for(...) {
: MyStruct temp;
: temp.m1 = ParseJson1();
: temp.m2 = ParseJson2();
: temp.m3 = ParseJson3();
: myTable.emplace_back(std::move(temp));
: }
m1, m2, m3 如果是 POD 的话,move 无效。如果是指针的话,move 其实没意义。
如果是复杂数据结构,还需要确保这个类型递归实现了所有的 move 构造函数(即使这样,还是会存在有 POD 成员需要拷贝)
从性能的角度来看,还是用指针或者 unique_ptr 更好一些。
:
: 临时变量temp每次循环完都是废弃的,temp里的资源直接move走完事。
:
: 当然,也可以用裸指针
:
: for(...) {
: auto temp = new MyStruct;
: temp->m1 = ParseJson1();
: temp->m2 = ParseJson2();
: temp->m3 = ParseJson3();
: myTable.emplace_back(temp);
: }
:
: 不过,最后还不能忘了myTable中的每个指针要释放掉。
: for(auto &p : myTable) {
: delete p;
: }
:
: 还可以用std::unique_ptr,不过最后也是要执行move:
:
: for(...) {
: auto temp = std::make_unique<MyStruct>();
: temp->m1 = ParseJson1();
: temp->m2 = ParseJson2();
: temp->m3 = ParseJson3();
: myTable.emplace_back(std::move(temp));
: }
:
: 我倾向于第一种写法。
:
:
: 【 在 toutouqi 的大作中提到: 】
: : 可不可以这样理解,move就是不保证输入参数数据完整性的拷贝,目的是为了某些情况下减少内存拷贝?
: : 用move的场景,如果改用指针,对象指针直接赋值,再把原指针赋0,连普通成员变量的拷贝都省了,看起来似乎比用move概念更清楚。不知道啥场景必须设计成用move而不用指针?
: A
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 125.35.123.*]
--
FROM 111.198.224.*