c – 什么激发了Stroustrup对资源管理技术的偏好顺序?
以下幻灯片来自Bjarne Stroustrups演讲“C的本质”:
我是否通过以下简单示例(值,原始指针,资源成员/子对象的智能指针)了解他的技术?: class foo{ std::vector<bar> subObj; int n; public: foo(int n) : n(n) { subObj.push_back(bar("snickers")); } }; 2. class foo{ std::vector<bar>* subObj; int n; public: foo(int n) : n(n){ subObj = new std::vector<bar>(); subObj->push_back(bar("snickers")); } ~foo() { delete subObj; } }; 3. class foo{ std::unique_ptr<std::vector<bar> > subObj; int n; public: foo(int n) : n(n){ subObj(new std::vector<bar>()); subObj->push_back(bar("snickers")); } }; 为什么1.优先于2.?如果我实例化一个foo对象并取消引用它以获取小n成员的值,那么vector成员也将被加载到内存中,对吧?使用2,只有指针被加载到内存中!对于这个问题,我想假设在执行期间向量会有些大. 另外,为什么2(RAII)优于智能指针?开销是否非常相似(在生命周期后都破坏资源)? 解决方法
无论2是什么,它都不比任何东西更可取.一旦你制作了一个foo对象的副本,这是一个等待发生的事故.
这非常困惑 – 这里的所有内容已经在内存中了,你究竟要加载到内存中的是什么?确实,2中的foo小于1中的foo,因此您可以在同一缓存行中放入更多的foos,当您在不触及向量的情况下操作foos数组时,可能会产生更好的性能. 但是一个向量本身只有三个指针(开始,结束,容量),所以它不像是一个巨大的局部性损失.矢量的内容可以任意大(当然可达到极限),但它们在其他地方.当你真正需要使用矢量时,foo的较小尺寸的微小局部增益很可能被额外的间接级别擦除. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |