C++ 如何计算对象对齐和共享_ptr?

C++ 如何计算对象对齐和共享_ptr?,c++,shared-ptr,make-shared,C++,Shared Ptr,Make Shared,假设我有一个由共享指针管理的对象:shared\u ptr。假设我的X类有98个字节大,最后一个数据成员是字节97-98(一个字符) 一般来说,共享ptr包含指向myX对象的原始指针和指向引用计数对象的原始指针,引用计数对象包含两个计数器(一个强引用计数器和一个弱引用计数器) 引用计数对象从哪个地址开始(即两个引用计数的位置)?它会紧跟在我的X类的第98个字节之后吗?或者会有一个特定的数字对齐,比如说32字节对齐,它会在第128字节?通常是什么决定了位置 假设使用了make\u shared。这

假设我有一个由共享指针管理的对象:
shared\u ptr
。假设我的
X
类有98个字节大,最后一个数据成员是字节97-98(一个字符)

一般来说,共享ptr包含指向my
X
对象的原始指针和指向引用计数对象的原始指针,引用计数对象包含两个计数器(一个强引用计数器和一个弱引用计数器)

引用计数对象从哪个地址开始(即两个引用计数的位置)?它会紧跟在我的
X
类的第98个字节之后吗?或者会有一个特定的数字对齐,比如说32字节对齐,它会在第128字节?通常是什么决定了位置


假设使用了
make\u shared

这肯定是一个实现细节

然而,实际上只有两个选项,引用计数可以在托管
T
对象之前或之后进行


在任何情况下,我都会假设引用计数器将与它们的自然对齐对齐,因为在某些平台上使用未自然对齐的整数会崩溃,而在其他平台上则会慢得多。

?共享指针(及其成员)与对象本身不同。它们的内存位置将是不相关的general@OliCharlesworth不是这样的:“另一方面,当使用make_shared时,跟踪对象和引用计数可以一起分配。”请看第二个图表。很有趣。所以,让你分享一些魔法。然而,为什么内部实施细节的一致性很重要?,似乎他们使用带有两个原子字的ref计数器的
\u Sp\u counted\u base
作为
\u Sp\u counted\u ptr\u inplace
的基类,该基类具有嵌套类
\u Impl
的数据成员,该类使用
\u gnu cxx::\u对齐的\u缓冲区
。因此,内存布局可能如下所示:vptr、强计数、弱计数、对齐缓冲区(假设为空分配器和默认删除器)。