加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:57:06 所属栏目:百科 来源:网络整理
导读:以下幻灯片来自Bjarne Stroustrups演讲“C的本质”: 我是否通过以下简单示例(值,原始指针,资源成员/子对象的智能指针)了解他的技术?: 1. class foo{ std::vectorbar subObj; int n; public: foo(int n) : n(n) { subObj.push_back(bar("snickers")); } };
以下幻灯片来自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的较小尺寸的微小局部增益很可能被额外的间接级别擦除.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读