c – 什么激发了Stroustrup对资源管理技术的偏好顺序?

c – 什么激发了Stroustrup对资源管理技术的偏好顺序?,第1张

概述以下幻灯片来自Bjarne Stroustrups演讲“C的本质”: 我是否通过以下简单示例(值,原始指针,资源成员/子对象的智能指针)了解他的技术?: 1. class foo{ std::vector<bar> subObj; int n; public: foo(int n) : n(n) { subObj.push_back(bar( 以下幻灯片来自Bjarne Stroustrups演讲“C的本质”:

我是否通过以下简单示例(值,原始指针,资源成员/子对象的智能指针)了解他的技术?:
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对资源管理技术的偏好顺序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1216619.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存