What type is used by std::allocate_shared to allocate memory?(STD::ALLOCATE_SHARED使用什么类型来分配内存?)
问题描述
发件人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 );sizeof(T),以便为共享指针的控制块和T对象使用一个分配。..。所有内存分配都使用alloc的副本完成,该副本必须满足Allocator要求。
Alloc::value_type应该是什么?
推荐答案
实际使用的类型取决于实现。根据Allocator要求,借助std::allocator_traits特征类模板,可以通过std::allocator_traits<A>::rebind_alloc<T>机制将任何分配器rebind赋给其他类型。
假设您有一个分配器
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>。分配器对象是通过相应的MyAlloc<S>的转换构造函数(请参阅分配器要求)从传递给std::allocate_shared()(此处为MyAlloc<T>{})的对象构造的。
让我们来看看一些特殊的implementation-libstdc++。对于上面的行,实际分配由
执行MyAlloc<std::_Sp_counted_ptr_inplace<T, Alloc<T>, (__gnu_cxx::_Lock_policy)2>
这是合理的:std::allocate_shared()为同时包含T和控制块的对象分配内存。_Sp_counted_ptr_inplace<T, ...>就是这样一个对象。它在_M_storage数据成员中包含T内部:
__gnu_cxx::__aligned_buffer<T> _M_storage;
许多其他地方也使用相同的机制。例如,std::list<T, Alloc>使用它来获取分配器,然后使用该分配器来分配列表节点,除了T之外,列表节点还保存指向其邻居的指针。
一个有趣的相关问题是,为什么分配器不是模板模板参数,这似乎是一个自然的选择。已讨论here。
这篇关于STD::ALLOCATE_SHARED使用什么类型来分配内存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:STD::ALLOCATE_SHARED使用什么类型来分配内存?
基础教程推荐
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 初始化列表*参数*评估顺序 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- CString 到 char* 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
