关注
同意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操作,不用临时构建对象。避免了不必要的复制,原来的数据不进行实际拷贝,只拷贝指向数据的所在地址即可。
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 同bg的你秋招战况如何? #
173796次浏览 1016人参与
# 2022毕业即失业取暖地 #
115866次浏览 703人参与
# 联影求职进展汇总 #
50771次浏览 323人参与
# 你实习是赚钱了还是亏钱了? #
29264次浏览 238人参与
# CVTE求职进展汇总 #
22578次浏览 319人参与
# 用一句话形容你的团队氛围 #
17844次浏览 177人参与
# 京东开奖 #
468093次浏览 2667人参与
# 哪些公司校招卡第一学历 #
219738次浏览 776人参与
# 牛客租房专区 #
122358次浏览 1347人参与
# 海康威视工作体验 #
45144次浏览 157人参与
# 腾讯音乐求职进展汇总 #
135582次浏览 1005人参与
# 嵌入式岗知多少 #
58280次浏览 548人参与
# 联影医疗求职进展汇总 #
5542次浏览 24人参与
# 毕业论文进行时 #
6199次浏览 80人参与
# 机械人与华为的爱恨情仇 #
136829次浏览 1012人参与
# 58同城求职进展汇总 #
39736次浏览 263人参与
# 找实习你看重大厂光环还是业务方向 #
41102次浏览 163人参与
# 我来点评面试官 #
15828次浏览 111人参与
# 面对逼签的应对技巧 #
6487次浏览 34人参与
# 扒一扒那些奇葩实习经历 #
126263次浏览 1098人参与
# 实习返校后,你的精神状态是__? #
36967次浏览 153人参与
查看16道真题和解析