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.