shared_ptr 源码解析

Page content

本文主要简单的备忘下,shared_ptr 一些简单的介绍。

智能指针的内存布局

shared_ptr 内存布局为:

|-------------------------------|              -------------
|element_type* _M_ptr           | -----------> |data fileld| <-----------|
|                               |              -------------             |
|__shared_count<_Lp> _M_refcount| ---|                                   |
|-------------------------------|    |               |-------------|     |
						             |_M_pi -------> |_M_use_count |     |
									                 |_M_weak_count|     |
													 |_M_ptr       | ----|
											         |-------------|

make_shared 构造时的内存布局

这里源码_Tp 实际上不是代表指针而是正常的数据类型。make_shared 经由 sp_counted_ptr_inplace 构造

内存布局展开基类及 _Impl 为:

|---------------|
| _M_use_count  |
| _M_weak_count |
|---------------|
| _M_impl       | 派生类数据 大小为 _Tp 存储真实数据
----------------

完整的内存布局为:

|-------------------------------|              
|element_type* _M_ptr           | -------------------------------------|
|__shared_count<_Lp> _M_refcount| ---- _M_pi  ---->|--------------     |
|-------------------------------|                  | _M_use_count |    |
												   | _M_weak_count|    |
												   | _M_impl(_Tp) |<---|
												   ----------------

EBO

虚基类优化技术

class Empty
{
};

为了区分不同的类,实际上空的class,至少占用一个字节,使用empty的两种case,

class Data1
{
		private:
				Empty data_;
				int a_;
};

class Data2 : private Empty
{
		private:
				int a_;
};

使用EBO之后 Data2的size,等效于int alignment对齐后的size.