unique_ptr的内存布局简单,仅含一个指针(8字节),无共享所有权,无引用计数,性能接近裸指针;shared_ptr包含两个指针(16字节),指向对象和控制块,控制块存储强弱引用计数、删除器等,需动态分配,有原子操作开销;make_shared可将对象与控制块连续分配,减少内存碎片并提升性能,但生命周期被绑定;因此unique_ptr更轻量高效,shared_ptr适用于共享所有权场景,理解其结构差异有助于优化c++++程序的性能与资源管理。

智能指针的内存布局和内部结构设计直接关系到它们的性能和使用场景。
unique_ptr
和
shared_ptr
虽然都用于自动管理动态内存,但它们的设计目标不同,导致内存布局和内部结构有显著差异。
1.
unique_ptr
unique_ptr
的内存布局:轻量、无开销
unique_ptr
的设计目标是“零成本抽象”——提供自动内存管理的同时,不带来运行时开销。
本质是一个包装了指针的类模板默认情况下,它只包含一个成员:原始指针(
T*
)如果使用自定义删除器(deleter),且该删除器有状态(比如捕获了变量的 lambda),则删除器也会被存储为成员删除器类型在编译期确定,通常作为模板参数,通过空基类优化(EBO)实现零开销存储
template<typename T, typename Deleter = default_delete>class unique_ptr { T* ptr; // 占 8 字节(64位系统) Deleter del; // 若 deletter 无状态,不占空间(EBO)};
特点:
大小通常等于一个指针(8 字节)不涉及引用计数所有权独占,不可复制,只能移动移动操作是廉价的指针转移
举例:sizeof(unique_ptr) == 8(常见平台)
2.
shared_ptr
shared_ptr
的内存布局:复杂但功能强大
shared_ptr
实现共享所有权,必须维护引用计数。它的内存布局比
unique_ptr
复杂得多。
每个
shared_ptr
实例包含两个指针:
指向管理对象的指针(managed object)指向控制块(control block)的指针
而控制块中包含:
强引用计数(shared count):记录有多少个
shared_ptr
共享该对象弱引用计数(weak count):记录有多少个
weak_ptr
指向该控制块自定义删除器(如果有)分配器(如果有)可能还包括对齐信息等元数据
templateclass shared_ptr { T* ptr; // 指向实际对象 control_block* cb; // 指向控制块(包含引用计数等)};
控制块通常在首次创建
shared_ptr
时动态分配(除非使用
make_shared
优化)。
特点:
每个
shared_ptr
实例大小是两个指针(16 字节)控制块额外占用内存(通常 16~32 字节,取决于平台和删除器)引用计数操作是原子的,线程安全但有性能开销析构时,当强引用归零,调用删除器销毁对象;当弱引用也归零,释放控制块
举例:
sizeof(shared_ptr) == 16(64位系统)
3. 关键对比:结构与内存开销
存储大小1 指针(8字节)2 指针(16字节)是否共享所有权否是引用计数无有(在控制块中)控制块无有(额外堆分配)删除器存储编译期优化,通常无开销存在控制块中,可能增加控制块大小性能极高,接近裸指针有原子操作和间接访问开销内存局部性好(对象独立)差(对象和控制块可能不连续)
4.
unique_ptr
unique_ptr
的优化:减少内存碎片
shared_ptr
的一个重要优势是将对象和控制块一起分配,减少一次内存分配,并提升缓存局部性。
make_shared
此时:
分配一块连续内存,包含
make_shared(...)
和控制块
auto sp = make_shared(42);
中的
int
和
shared_ptr
指向同一块内存的不同偏移减少堆分配次数,提高性能
但注意:对象和控制块的生命周期被绑定,即使引用计数归零,只要还有
ptr
,整个内存都不能释放。
小结
cb
是“裸指针的替代品”,内存布局极简,几乎没有额外开销
weak_ptr
是“带引用计数的智能指针”,需要额外存储控制块,带来内存和性能成本优先使用
unique_ptr
,仅在需要共享所有权时才用
shared_ptr
使用
unique_ptr
可优化
shared_ptr
的内存布局和性能
基本上就这些,理解它们的结构差异有助于写出更高效、更安全的 C++ 代码。
make_shared
shared_ptr
以上就是智能指针内存布局怎样 unique_ptr与shared_ptr结构对比的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1472193.html
微信扫一扫
支付宝扫一扫