gpt4 book ai didi

c++ - std::allocate_shared 使用什么类型来分配内存?

转载 作者:行者123 更新时间:2023-12-05 01:54:25 28 4
gpt4 key购买 nike

来自 https://en.cppreference.com/w/cpp/memory/shared_ptr/allocate_shared :

template< class T, class Alloc, class... Args >
shared_ptr<T> allocate_shared( const Alloc& alloc, Args&&... args );

The storage is typically larger than sizeof(T) in order to use one allocation for both the control block of the shared pointer and the T object. ... All memory allocation is done using a copy of alloc, which must satisfy the Allocator requirements.

然后使用什么类型来分配上述存储?换句话说,Alloc::value_type 应该是分配器要求之一?

最佳答案

实际使用的类型取决于实现。通过 Allocator要求并在 std::allocator_traits 的帮助下traits 类模板,任何分配器都可以是 rebind通过 std::allocator_traits<A>::rebind_alloc<T> 编辑为另一种类型机制。

假设你有一个分配器

template<class T>
class MyAlloc { ... };

如果你写:

std::allocate_shared<T>(MyAlloc<T>{});

这并不意味着 MyAlloc<T>将用于执行分配。如果在内部我们需要分配另一种类型的对象 S , 我们可以通过

std::allocator_traits<MyAlloc<T>>::rebind_alloc<S>

它被定义为如果MyAlloc本身不提供 rebind<U>::other成员类型别名,使用默认实现,返回MyAlloc<S> .分配器对象由传递给 std::allocate_shared() 的对象构造而成(这里,MyAlloc<T>{})通过适当的MyAlloc<S>的转换构造函数(请参阅Allocator 要求)。

让我们来看看一些特别的implementation - libstdc++。对于上面的行,实际分配是由

MyAlloc<std::_Sp_counted_ptr_inplace<T, Alloc<T>, (__gnu_cxx::_Lock_policy)2>

这是合理的:std::allocate_shared()为同时包含 T 的对象分配内存和一个控制 block 。 _Sp_counted_ptr_inplace<T, ...>是这样一个对象。它拥有 T_M_storage 内部数据成员:

__gnu_cxx::__aligned_buffer<T> _M_storage;

许多其他地方使用相同的机制。例如,std::list<T, Alloc>使用它来获得一个分配器,然后用于分配列表节点,除了 T指向他们的邻居。

一个有趣的相关问题是为什么分配器不是模板模板参数,这似乎是一个自然的选择。正在讨论here .

关于c++ - std::allocate_shared 使用什么类型来分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70630371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com