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

智能指针的内存布局和内部结构设计直接关系到它们的性能和使用场景。
unique_ptr
shared_ptr
unique_ptr
unique_ptr
T*
template<typename T, typename Deleter = default_delete<T>>
class unique_ptr {
T* ptr; // 占 8 字节(64位系统)
Deleter del; // 若 deletter 无状态,不占空间(EBO)
};举例:sizeof(unique_ptr<int>) == 8(常见平台)
shared_ptr
shared_ptr
unique_ptr
每个
shared_ptr
而控制块中包含:
shared_ptr
weak_ptr
template<typename T>
class shared_ptr {
T* ptr; // 指向实际对象
control_block* cb; // 指向控制块(包含引用计数等)
};控制块通常在首次创建
shared_ptr
make_shared
shared_ptr
举例:
(64位系统)sizeof(shared_ptr<int>) == 16登录后复制
| 项目 | @@######@@ | @@######@@ |
|---|---|---|
| 存储大小 | 1 指针(8字节) | 2 指针(16字节) |
| 是否共享所有权 | 否 | 是 |
| 引用计数 | 无 | 有(在控制块中) |
| 控制块 | 无 | 有(额外堆分配) |
| 删除器存储 | 编译期优化,通常无开销 | 存在控制块中,可能增加控制块大小 |
| 性能 | 极高,接近裸指针 | 有原子操作和间接访问开销 |
| 内存局部性 | 好(对象独立) | 差(对象和控制块可能不连续) |
unique_ptr
shared_ptr
make_shared
此时:
make_shared<T>(...)
auto sp = make_shared<int>(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结构对比的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号