从内存布局角度看,cpp的shared_ptr和rust 的Arc,哪个更好一些?必须承认,Rust 的Arc在内存布局上会比C++的 std::shared_ptr要好些因为Rust 的 Arc默认是侵入式的内存布局,没有指针跳转和多次内存分配C++的 shared_ptr 为了灵活,方便实现管理非侵入式的对象,必须有两块内存:对象数据和控制块!所以,就有两次的内存分配,内存布局上自然不如 Rust 的 Arc.为了解决多次内存分配问题,C++11也引入了make_shared,一次性分配连续的内存。使其在内存布局上跟Rust 的 Arc类似1、C++ std::shared_ptr的内存布局C++的 shared_ptr 内部有两个指针。这两个指针是1. Ptr to Object:指向实际管理的数据对象的指针。2. Ptr to Control Block: 指向一个控制块的指针。控制块包含:strong_ref_count: 强I用计数(有多少个shared_ptr 指向对象)weak_ref_count:弱引用计数(有多少个weak_ptr 指向对象)。deleter: 自定义删除器(可选)allocator:自定义分配器(可选)。shared_ptr的默认构造 std:shared_ptrp(new T):两次分配:一次分配T对象,一次分配Control Block。对象和控制块在堆内存是不连续的。内存不连续,访问I用计数和访问对象数据就会两次 Cache Miss。;tack -o Sytesstd::shared_ptrptr to Contro1 Block ptr to ObjectHeap AlUcation Heap Allbcation 1ContStrong Ref Count↓Weak Ref Count 实际对象Deleter / Alloca用 std:make_shared():一次分配:编译器会分配一块连续的大内存,同时容纳 Control Block和T对象。内存连续就能提高缓存局部性。ptr to Control Block Ptr to Objectingle Heap Alloc内存Bloc 实际对象T 4 私g고 (Str Re但还是有不可避免的:强引用归零,对象析构了,但这块大内存还不能释放,必须等到弱引用也归零(因为控制块还在里面)。2、Rust Arc的内存布局Rust 的 ArC内部只有一个指针: Ptr toAlocation。一个非空指针,直接指向一块连续内存。内存块包含1. strong:强引用计数。2. weak:弱引用计数。3. data:实际的数据T。-8BytesArcPtr to ArcInner堆ArcInner 内存布局Strong Ref Count(Atomic usize)Weak Ref Count ArcInnermic usize)实际数据TRust 的 Arc:new(T)行为和C++的make_shared类似。但只有一个指针,不像C++那样存两个指针。访问数据时,引用计数和数据对象同一个Cache Line*的概率非常大。Rust的指针跳转一次就能拿到内存块,偏移量直接访问数据和计数。C++ shared_ptr就要两次指针跳转,访问引用计数要指针跳转;访问数据要另一个指针跳转。但也不能说两个指针的设计没有用。双指针能支持 别名构造和非内存资源管理。



THE END
- 本文链接:
- https://zxki.cn/wzym/55856.html
- 版权声明:本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!
请登录后发表评论
注册
停留在世界边缘,与之惜别