我是否通过以下简单示例(值,原始指针,资源成员/子对象的智能指针)了解他的技术?:
1.
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对象的副本,这是一个等待发生的事故.Why is 1. preferable over 2.? If I instantiate a foo object and dereference it in order to get the value of the small n member,the vector member will be loaded into memory as well,right? With 2,only the pointer is loaded into memory!
这非常困惑 – 这里的所有内容已经在内存中了,你究竟要加载到内存中的是什么?确实,2中的foo小于1中的foo,因此您可以在同一缓存行中放入更多的foos,当您在不触及向量的情况下 *** 作foos数组时,可能会产生更好的性能.
但是一个向量本身只有三个指针(开始,结束,容量),所以它不像是一个巨大的局部性损失.矢量的内容可以任意大(当然可达到极限),但它们在其他地方.当你真正需要使用矢量时,foo的较小尺寸的微小局部增益很可能被额外的间接级别擦除.
总结以上是内存溢出为你收集整理的c – 什么激发了Stroustrup对资源管理技术的偏好顺序?全部内容,希望文章能够帮你解决c – 什么激发了Stroustrup对资源管理技术的偏好顺序?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)