shared_ptr的大小是两个原始指针的大小,一个指向资源,另一个指向保持引用计数的控制块。通常,控制块是与资源分开分配的,但对于make_shared,控制块很可能是与资源一起分配的,我(猜测(类似于:
template <typename T>
struct ResourceAndControlBlock
{
struct ControlBlock{
int weakReferences, strongReferences;
}controlBlock;
char obj[sizeof(T)]; // Object can exist here or not
};
当您执行make_shared{}时,它会返回一个shared_ptr,其中包含两个指针,一个指向char obj[](资源(,另一个指向"controlBlock"。
我想知道它是否可以用这种方式实现,make_shared返回一个只有一个指针的共享指针,指向资源,然后当需要访问控制块中的信息时,为了检查资源是否仍然有效,或者减少任何引用,它可以用"resource pointer"减去sizeof(ControlBlock(来访问它。
为什么这是一个坏主意,只是因为它使具有两种不同类型的共享指针的事情变得复杂,一种有两个指针,另一种只有一个?或者这样做有什么问题吗?
编辑:我刚刚记得严格的别名规则,是不是指向资源的指针不能转换为ControlBlock指针来读取控制块?
shared_ptr的大小是两个原始指针的大小,一个指向资源,另一个指向保持引用计数的控制块。
虽然这是共享指针的一种可能实现,但它并不是唯一一种。另一种可能的实现方式是(指向控制块的(单个指针,并且具有指向控制块中的资源的指针。这样做的缺点是,取消引用共享指针需要两次(依赖的(内存访问,这稍微慢一些。
混合实现可以有一个指向控制块中资源的指针和shared_ptr中的两个指针(指向控制块和资源(,但在weak_ptr中只有一个指针(流向控制块(,因为weak_ptr.在尝试取消引用资源指针之前,需要访问控制块(查看对象是否仍然有效(。