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

2024-01-07

From https://en.cppreference.com/w/cpp/memory/shared_ptr/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,它必须满足分配器 https://en.cppreference.com/w/cpp/named_req/Allocator要求。

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


实际使用的类型取决于实现。经过分配器 https://en.cppreference.com/w/cpp/named_req/Allocator的要求并在帮助下std::allocator_traits https://en.cppreference.com/w/cpp/memory/allocator_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() (here, MyAlloc<T>{})通过适当的MyAlloc<S>的转换构造函数(参见分配器要求)。

我们来看看一些特别的执行 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/shared_ptr_base.h-libstdc++。对于上面的行,实际分配是由

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

这是合理的:std::allocate_shared()为包含两者的对象分配内存T和一个控制块。_Sp_counted_ptr_inplace<T, ...>就是这样一个物体。它拥有T在其自身内部_M_storage数据成员:

__gnu_cxx::__aligned_buffer<T> _M_storage;

同样的机制也用在许多其他地方。例如,std::list<T, Alloc>使用它来获取一个分配器,然后使用该分配器来分配列表节点,除了T持有指向其邻居的指针。

一个有趣的相关问题是为什么分配器不是模板模板参数,这似乎是一个自然的选择。正在讨论here https://stackoverflow.com/questions/25572251/in-allocator-aware-stl-classes-why-are-the-allocators-not-template-template-arg.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::allocate_shared 使用什么类型来分配内存? 的相关文章

  • 从 WatchOS 捕获 Apple Watch 的型号标识符

    似乎没有任何记录的官方方法可以从手表应用程序获取 Apple Watch 模型 但有一篇文章显示了特殊用途sysctlbyname 如何确定Apple Watch型号 https stackoverflow com questions 49
  • pop() 期间提升 Fibonacci 堆访问冲突

    Context 我目前正在实现某种形式的 A 算法 我决定使用 boost 的斐波那契堆作为底层优先级队列 我的图表是在算法运行时构建的 作为我使用的顶点对象 class Vertex public Vertex double double
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • 如何使用仿函数作为类模板中的成员?

    我试图使用函子作为std function类模板内的对象 以下是我到目前为止所做的事情 the functor class template template
  • 在 C 中使用模板函数的最短示例?

    我如何处理函数echo tpl可以采取1类型参数int or string 然后打印出来 C没有模板 我认为你能做的最好的事情就是使用联合或让函数具有不同的名称 后一种具有不同名称的方法是准标准方法 例如fabs fabsf fabsl a
  • 如何向 Iron Python 添加模块?

    我一直在尝试使用 C Visual Studio 执行以下 Python 代码 graphcreater py 我通过 NuGet 包管理器添加了 IronPyton 2 7 7 和 IronPython StdLib 2 7 7 一旦我运
  • C++ 局部变量销毁顺序

    C 11 中是否存在局部变量释放的定义顺序 更简洁地说 同一作用域中两个局部变量的析构函数的副作用将以什么顺序变得可见 e g struct X X do something int main X x1 X x2 return 0 Is x
  • 无符号长十六进制表示

    include
  • 如何为 IAsyncOperation 指定回调方法

    是否可以指定一个方法完成后调用async手术 平台 C Windows Phone 8 我需要实现非阻塞方法来异步发送UDP数据包 他们有我的方法 onWriteComplete int errorCode 操作完成时回调 这是我尝试过的
  • 如何重命名 MacOS/X 程序中的程序名称菜单标签?

    我有一个在 MacOS X 下运行的基于 Qt 的 GUI 程序 我希望能够更改该程序的第一个菜单标题的标签 即此屏幕截图中用红色圈出的标签 有没有一种编程方法可以做到这一点 假设不存在基于 Qt 的解决方案 则 Objective C 本
  • WCF:通用接口的序列化可能吗?

    我正在尝试实现一个服务契约 其中包含一个采用通用接口的方法 并且该通用接口本身被赋予一个接口参数 我用 ServiceKnownType 装饰了服务接口 用常规 KnownType 装饰了服务实现 并用常规 KnownType 装饰了数据契
  • 像 MS Excel 一样在 C++ 中舍入双精度值

    我在网上进行了搜索 但找不到解决我的问题的方法 我只是想要一个像 MS Excel 那样对双精度值进行舍入的函数 这是我的代码 include
  • Microsoft Build Tools 2013 缺少 v120 目录

    我们已经安装了 Microsoft Build Tools 2013 从http www microsoft com en us download details aspx id 40760 http www microsoft com e
  • 运行 SQL Server 报告服务时如何解决“远程服务器返回错误:(401) 未经授权”?

    我正在用这个code http www codeproject com Articles 25994 Creating a Proxy to Download PDF Reports from SRS从 SSRS 创建和下载 PDF 报告
  • 使用 C# winforms 与 Windows 中的其他桌面应用程序交互

    我想知道是否可以与使用我的程序的其他程序进行交互 例如 单击另一个程序上的按钮等 我不确定这是否可能 但如果可能的话 有人可以提供一些 C 示例代码 Thanks 您可以创建消息并将其发送到其他进程 为此 您必须在 C 代码中使用 P In
  • 如何隐藏鼠标光标?

    我想问是否有人可以为我提供一个 C 代码 在其中我可以在按下特定键时隐藏 显示鼠标指针 我发现一些只为 TURBO C 编写的代码 它们都不能使用 dev c 甚至 Visual c 编译和运行 我尝试运行在 Dev C 中找到的代码 但我
  • Action 的通用约束未按预期工作

    我无法理解为什么以下代码片段没有给我错误 public void SomeMethod
  • 我使用 difftime 的 c 函数有时会返回 65535

    我有一个函数 使用 difftime 来检测自通信心跳停止以来的时间 以秒为单位 该函数的运行速度可以达到每 50 毫秒一次 该函数似乎可以工作 除了偶尔返回 65535 之外 我可以将执行次数减少到每秒一次 因为 difftime 的返回
  • 在 Outlook 中检索当前电子邮件正文

    在我的 Outlook 插件中 我想在功能区上添加一个按钮 因此当用户单击此按钮时 我想检索当前选定的电子邮件的正文 我有此代码 但它只检索收件箱中的第一封电子邮件 因为索引为 1 Microsoft Office Interop Outl
  • 用于 DSP 的快速 2D 卷积

    我想实现一些图像处理算法 这些算法旨在运行在小猎犬板 http en wikipedia org wiki Beagle Board 这些算法广泛使用卷积 我正在尝试为 2D 卷积找到一个好的 C 实现 可能使用快速傅里叶变换 我还希望该算

随机推荐

  • iOS SDK。显示通话中状态栏

    任何人都知道如何在应用程序进入后台时显示通话状态栏和来自应用程序的消息 我知道 AppStore 中的许多应用程序都可以执行此操作 例如 http myevoz com http myevoz com 据我了解 他们使用 SBStatusB
  • Angular 6:在子路由中跳过父路由解析器?

    我正在尝试向我的应用程序添加路由 并且我有一个带有parentResolver的父路由和一个带有Child Resolver的子路由 当我访问 parent 时 父解析器完美启动 但问题是 当我访问 parent child 时 父解析器会
  • UISplitViewController - 防止 iPhone 6 plus 上的横向分割

    我在我的应用程序中使用 UISplitViewController 这在 iPad 上工作得很好 主要和次要始终可见 并且在大多数 iPhone 上工作得很好 它的作用类似于 UINavigationController 在 iPhone
  • 如何使长TextView的一部分在屏幕上可见?

    我在 ScrollView 中有一个 TextView TextView 充满了大文本 任何时候只有部分文本在屏幕上可见 现在我想 以编程方式 强制文本的某些部分对用户可见 例如 我的文字是 Lorem ipsum dolor sat am
  • 我如何知道我的服务器是否有 NUMA?

    从 Java 垃圾收集中跳出来 我遇到了NUMA 的 JVM 设置 http www slideshare net ludomp gc tuning in the hotspot java vm a fisl 10 presentation
  • 无法理解条件执行流程[重复]

    这个问题在这里已经有答案了 一个简单的js片段 为什么总是提示 结果为空 据我了解 if块应该被执行 因为result is true并警惕 结果不为空 这是因为 进行隐式类型转换 如果您使用严格版本 它会做你所期望的 但宽松版型 会将这两
  • Firebase Android 自动登录

    所以我设置了电子邮件 密码注册和登录 那是有效的 我以为 Firebase 已经解决了这个问题 但显然没有 我希望在用户关闭应用程序后 下次打开应用程序时就已经登录 缺什么 class LoginActivity AppCompatActi
  • 使用 nth-child 设置第 4 项及以后项目的样式

    我有一个列表项 我希望第四项及以后的项有不同的background color 我尝试过以下方法 li nth child 4 background color blue 这仅对第 4 个项目进行样式设置 然后我尝试了以下操作 希望它能够为
  • Java 8 多线程:如何实现并行性以及单个线程的超时?

    我想要实现的目标摘要 我想并行执行 N 个任务 这样任何单个任务的运行时间都不应超过两秒 我们可以将此类任务标记为失败 作为输出 我想返回成功任务的输出和失败任务的状态为失败 此外 一项任务的超时不应导致电路中断 即其他任务的执行不应停止
  • 如何在 UML 中表示从模板参数的继承?

    使用 UML 我如何表示A lt Foo gt 在下面的代码中 template lt class T gt class A public T class Foo A lt Foo gt a foo 像这样的东西 对可怜的ascii艺术表示
  • ForkJoinPool - 为什么程序抛出 OutOfMemoryError?

    我想在 Java 8 中尝试 ForkJoinPool 所以我编写了一个小程序来搜索给定目录中名称包含特定关键字的所有文件 Program public class DirectoryService public static void m
  • C# 将字节数组附加到现有文件

    我想将字节数组附加到已经存在的文件中 C test exe 假设以下字节数组 byte appendMe new byte 1000 File AppendAllBytes C test exe appendMe Something lik
  • 嵌套 jQuery 选择器

    无论如何 是否有嵌套的 jQuery 选择器 例如 如果该页面还有一个ID LeadEditForm Title 某处然后执行以下操作 jQuery id A0 R0 Main Phone Number live mousedown fun
  • 在 Android 中使用 EditText 小部件屏蔽输入

    有没有办法可以为 Android 中的 EditText 控件指定输入掩码 我希望能够为社会安全号码指定类似 的内容 这将导致任何无效输入被自动拒绝 例如 我输入字母字符而不是数字 我意识到我可以添加 OnKeyListener 并手动检查
  • 如何检测用户是否不允许位置更新

    如果用户在首次启动时拒绝允许位置更新 我怎么能检测到这个 检查CLLocationManager 的authorizationStatus 方法
  • Environment.getExternalStorageDirectory().listFiles() 返回 null

    我的应用程序中需要一个文件选择器 在尝试了不起作用的第三方库 无内容 后 我尝试自己实现它 并且得到了相同的结果 最奇怪的是 Environment getExternalStorageDirectory listFiles 返回空值 这是
  • 如何让 Pycharm 从测试文件夹递归运行所有 python 单元测试

    我来自 Java 背景 因此我将单元测试组织成单独的并行测试层次结构 以反映我的主项目的结构 我使用 PyCharm 代替 Intellij 或 Eclipse 在这两个 I IDE 中 我可以选择任何正在测试的包 并在此命名空间下递归运行
  • 如何获取 HTML5 画布文本来显示 html 实体?

    我正在解析一个 xml 文件 该文件存储我需要在画布上显示的图像 标题数据 然而 偶尔文件中会有一个实体 当将文本绘制到画布上时 它会将其解释为平面文本 我怎样才能得到 copy 在画布上显示为 这是否可能 或者有人知道一个好的解决方法吗
  • Nhibernate Linq 查询到 QueryOver

    我有以下代码 1 ids GetAnArrayOfIds 2 jobEntities jobEntities Where j gt j Locations Select l gt l Id Any ids Contains 如何使用 Que
  • std::allocate_shared 使用什么类型来分配内存?

    From https en cppreference com w cpp memory shared ptr allocate shared https en cppreference com w cpp memory shared ptr