关注
同意1楼,我也估计是说移动语义,虽然这是C++11标准中已经优化过的东西,C++11也不算什么新东西了。和楼上说的存指针本质上是一样,但是可以直接在vector中优化。 对于vector这种,扩容时肯定要赋值原来的内容,这个开销无法避免。除非你自定义allocator,用内存池,感觉太复杂了,而且这真的有实际作用么? 移动语义对vector的优化在于存放复杂类型,在复制时会调用拷贝构造函数。比如这段代码(copy代表100个元素的拷贝) #include <iostream>
#include <vector>
using namespace std;
struct Object {
Object() {
p = new int[100];
cout << "ctor" << endl;
}
~Object() {
if (p) {
cout << "dtor" << endl;
delete[] p;
}
}
Object(const Object& rhs) {
cout << "copy ctor" << endl;
p = new int[100];
for (int i = 0; i < 100; i++) p[i] = rhs.p[i];
}
int* p;
};
int main() {
vector<Object> v(2);
cout << v.size() << " " << v.capacity() << endl;
v.push_back(Object());
return 0;
}
运行结果如下 # ./a.out
ctor
ctor
2 2
ctor
copy ctor
copy ctor
copy ctor
dtor
dtor
dtor
dtor
dtor
dtor
可以发现在容量为2时插入新对象,需要把原来的2个对象拷贝过来,涉及到内部的2*100个int的拷贝,再把新对象的100个int拷贝过来。但这是没必要的,因为旧对象一共300个int全部都拷贝了一份,然后还把原来的给析构了。如果在C++11标准下,给Object加上移动构造函数(move代表1次指针的拷贝) Object(Object&& rhs) noexcept : p(rhs.p) {
cout << "move ctor" << endl;
rhs.p = nullptr;
}
运行结果变成了 # ./a.out
ctor
ctor
2 2
ctor
move ctor
move ctor
move ctor
dtor
dtor
dtor
可以看到之前多出来的3次copy和dtor变成了3次move,也就是说避免深拷贝,而是仅仅拷贝指针,接管之前的资源。最后把push_back那句改成v.emplace_back(),结果如下 # ./a.out
ctor
ctor
2 2
ctor
move ctor
move ctor
dtor
dtor
dtor
继续减少了1次move操作,不用临时构建对象。避免了不必要的复制,原来的数据不进行实际拷贝,只拷贝指向数据的所在地址即可。
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
03-25 15:32
陕西科技大学 嵌入式软件开发 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 春招进度记录 #
20114次浏览 130人参与
# 软开人,说说你的烦心事 #
31767次浏览 153人参与
# 实习进度记录 #
21324次浏览 144人参与
# 大疆今年的机械笔试难吗? #
38923次浏览 436人参与
# 大疆的机械笔试比去年难吗 #
68446次浏览 595人参与
# 机械人,你会为了哪家公司违约? #
58779次浏览 269人参与
# 安利/避雷我的专业 #
65233次浏览 487人参与
# 假如你的老板掉河里,你的工作能为他做什么 #
25548次浏览 366人参与
# 校招求职有谈薪空间吗 #
126545次浏览 1779人参与
# 关于提前批我想问 #
192154次浏览 2111人参与
# 初创公司值得加入吗? #
18652次浏览 163人参与
# 2022毕业生求职现身说法 #
79330次浏览 675人参与
# 找工作如何保持松弛感? #
43621次浏览 700人参与
# 参加完秋招的机械人,还参加春招吗? #
36956次浏览 427人参与
# 2022毕业的你对23届的寄语 #
39550次浏览 543人参与
# 秋招感动瞬间 #
17768次浏览 157人参与
# 我心目中的理想工作是这样的 #
55722次浏览 776人参与
# 机械制造秋招总结 #
46639次浏览 454人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
24439次浏览 452人参与
# 工作经验重要还是工资重要? #
45417次浏览 564人参与