C++ boost::在哪里为底层对象和引用计数对象生成共享大小的内存分配?

C++ boost::在哪里为底层对象和引用计数对象生成共享大小的内存分配?,c++,memory-management,boost,shared-ptr,make-shared,C++,Memory Management,Boost,Shared Ptr,Make Shared,我试图理解boost::make_shared如何为boost::shared_ptr管理的对象和引用计数对象(shared_ptr使用)分配内存 make_shared函数在此处开始执行: template< class T, class A1, class A2, class A3 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&a

我试图理解
boost::make_shared
如何为
boost::shared_ptr
管理的对象和引用计数对象(
shared_ptr
使用)分配内存

make_shared
函数在此处开始执行:

template< class T, class A1, class A2, class A3 >
typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
{
    //Seems to create the smart_ptr for the object
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );

    //Not sure?
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );

    //Calculates the address at which the bulk-allocation begins
    void * pv = pd->address();

    //Allocates the memory at address pv?
    ::new( pv ) T(
        boost::detail::sp_forward<A1>( a1 ), 
        boost::detail::sp_forward<A2>( a2 ), 
        boost::detail::sp_forward<A3>( a3 )
        );

    //Not sure
    pd->set_initialized();

    //Not sure
    T * pt2 = static_cast< T* >( pv );

    //Not sure
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    return boost::shared_ptr< T >( pt, pt2 );
}
模板
typename boost::detail::sp_if_not_array:键入make_shared(A1&&A1、A2&&A2、A3&&A3)
{
//似乎为对象创建了智能ptr
boost::共享ptrpt(静态强制转换(0),boost\u SP\u MSD(T));
//不确定?
boost::detail::sp_ms_deleter*pd=static_cast*>(pt._internal_get_untyped_deleter());
//计算批量分配开始的地址
void*pv=pd->address();
//在地址pv分配内存?
::新(pv)T(
推进::细节::sp_前进(a1),
推进::细节::sp_前进(a2),
推进::细节::sp_前进(a3)
);
//不确定
pd->set_initialized();
//不确定
T*pt2=静态铸件(pv);
//不确定
boost::detail::sp_启用_共享_来自此(&pt,pt2,pt2);
返回升压::共享(pt,pt2);
}
有人能帮我解释一下剩下的台词吗

我试图确定大容量内存分配(指向的对象和共享\u ptr引用计数对象)的大小是在哪里确定的

我抛出的是,在分配地址时,调用<代码> AddiScript()/代码>似乎不考虑<代码> t>代码>对象的大小。


(我真的不知道进入方法并传递给placement
new()
调用的三个
AX
参数是什么

  boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
这将从共享指针获取删除器地址。这将指向上面创建的删除器

    //Calculates the address at which the bulk-allocation begins
    void * pv = pd->address();
这将返回类型
T
的起始地址,该类型当前未初始化,是删除程序的一部分

    //Allocates the memory at address pv?
    ::new( pv ) T(
        boost::detail::sp_forward<A1>( a1 ), 
        boost::detail::sp_forward<A2>( a2 ), 
        boost::detail::sp_forward<A3>( a3 )
        );
这是deleter中的一个内部标志,它让deleter知道
T
已经被构造(这样当调用deleter的
操作符()
时,它将销毁它)

这是提供此功能的
启用共享功能所必需的。此内部函数为
从\u This
启用\u共享\u设置底层机制。当您将某些内容放入
共享\u ptr

    return boost::shared_ptr< T >( pt, pt2 );
returnboost::shared_ptr(pt,pt2);

这实际上创建了一个新的
boost::shared_ptr
,它使用了与
pt
相同的引用计数区域,但是它的
get()
和相关方法将返回
pt2
,它是指向
T
的指针,存储在deleter中。

让我们逐行理解它

  boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
这将从共享指针获取删除器地址。这将指向上面创建的删除器

    //Calculates the address at which the bulk-allocation begins
    void * pv = pd->address();
这将返回类型
T
的起始地址,该类型当前未初始化,是删除程序的一部分

    //Allocates the memory at address pv?
    ::new( pv ) T(
        boost::detail::sp_forward<A1>( a1 ), 
        boost::detail::sp_forward<A2>( a2 ), 
        boost::detail::sp_forward<A3>( a3 )
        );
这是deleter中的一个内部标志,它让deleter知道
T
已经被构造(这样当调用deleter的
操作符()
时,它将销毁它)

这是提供此功能的
启用共享功能所必需的。此内部函数为
从\u This
启用\u共享\u设置底层机制。当您将某些内容放入
共享\u ptr

    return boost::shared_ptr< T >( pt, pt2 );
returnboost::shared_ptr(pt,pt2);

这实际上创建了一个新的
boost::shared_ptr
,它使用与
pt
相同的引用计数区域,但其
get()
和相关方法将返回
pt2
,它是指向
T
的指针,它存储在删除器中。

我认为引用计数对象放在内存中的对象之前,地址较低,对吗?@user997112:我不知道,但我想是的。依赖任何特定的位置似乎都是不明智的。事实上,如果你使用
shared\u ptr(new T)
vs.
make\u shared()
,位置可能会有所不同。这是一个实现细节,标准没有对此做任何说明。我认为引用计数对象放在内存中对象的前面,地址较低,对吗?@user997112:我不知道,但我想是的。依赖任何特定的位置似乎都是不明智的。事实上,如果你使用
shared\u ptr(new T)
vs.
make\u shared()
,位置可能会有所不同。这是一个实现细节,标准没有对此做任何说明。