分配器感知的容器分配是如何实现的?

2023-12-31

例如,从std::deque::运算符 =在 C++ 参考中:
(1)复制分配 (const std::deque 及其他)

将内容替换为其他内容的副本。
如果 std::allocator_traits::propagate_on_container_copy_assignment() 是 true,目标分配器被源分配器的副本替换 分配器。如果目标分配器和源分配器不比较 相等,目标(*this)分配器用于释放内存, 然后在复制之前使用其他分配器来分配它 元素。

If this->get_allocator() == other.get_allocator(),我可以简单地销毁和释放this' 如果需要的话元素,或者如果需要的话分配和构造元素,或者复制分配元素other to *this如果需要的话。
但如果没有呢?上面的引用是否意味着我无法复制分配元素,所以我必须首先使用来销毁和取消分配所有元素this->get_allocator(),然后分配并构造元素,使用other.get_allocator()?
但如果是这样的话,我为什么要使用other.get_allocator()用于分配?
稍后会不会导致一些运行时错误,如this不会正确释放内存吗?

(2) 移动分配 (std::双端队列&&其他)

将内容替换为其他内容 使用移动语义(即 other 中的数据从 other 移动到 这个容器)。 other 随后处于有效但未指定的状态。 如果 std::allocator_traits::propagate_on_container_move_assignment() 为 true 时,目标分配器将被源分配器的副本替换 分配器。如果为 false 并且源分配器和目标分配器执行此操作 比较不相等,目标无法获得源的所有权 内存并且必须单独移动分配每个元素,分配 根据需要使用自己的分配器添加额外的内存。无论如何,所有 最初存在于 *this 中的元素被破坏或替换 通过元素移动赋值。

If this->get_allocator() == other.get_allocator(),这是一个简单的任务。
但如果不是,则会出现上述相同的问题,只不过在这种情况下使用了移动分配。

对于这两种情况,我都有一个额外的问题。
如果元素既不能复制分配也不能移动分配,是否可以销毁它并从其他元素构造?如果是,我应该使用谁的分配器?


POCCA(在容器上复制分配)分配器作为容器复制分配的一部分进行复制分配。同样,当分配容器的移动时,POCMA 分配器也会被移动分配。

上面的引用是否意味着我无法复制分配元素,所以我必须首先使用来销毁和取消分配所有元素this->get_allocator(),然后分配并构造元素,使用other.get_allocator()?

Correct.

但如果是这样的话,我为什么要使用other.get_allocator用于分配?稍后会不会导致一些运行时错误,如this->get_allocator()不会正确释放内存吗?

因为赋值会传播分配器:赋值后,this->get_allocator()是一个副本other.get_allocator(),因此它可以安全地释放它分配的内存。

If this->get_allocator() == other.get_allocator(),这是一个简单的任务。但如果不是,则会出现上述相同的问题,只不过在这种情况下使用了移动分配。

事实上,这是完全不同的。使用 POCMA 分配器移动分配很简单:您销毁了中的所有元素*this,释放内存,并掠夺内存和分配器other.

容器移动分配必须诉诸元素移动分配/构造的唯一情况是当您有一个非POCMA分配器和分配器比较不相等。在这种情况下,所有的分配和构建都是通过this->get_allocator()因为你不传播任何东西。

对于这两种情况,我都有一个额外的问题。如果元素既不能复制分配也不能移动分配,是否可以销毁它并从其他元素构造?如果是,我应该使用谁的分配器?

使用最初构建它的分配器销毁它;使用它将被销毁的分配器来构造它。换句话说,如果要传播分配器,则使用目标分配器销毁它并使用源分配器构造。

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

分配器感知的容器分配是如何实现的? 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Pytest:测试运行后如何显示生成的报告?

    我将 pytest 与pytest html https github com pytest dev pytest html测试运行后生成 HTML 报告的插件 我正在使用自动连接的会话装置在浏览器中自动打开生成的 HTML 报告 pyte
  • 从 VS2008 发布的等效 msbuild 命令

    你知道 msbuild 中的发布命令与 VS2008 中的发布命令相对应吗 我想要的是结果输出是相同的 没有 PublishedWebSites 子目录 这可以从命令行实现还是我应该使用构建文件 Thanks 通过指定 WebProject
  • ASP.NET (MVC) - 将页面渲染到文件

    我必须创建一堆静态 html 文件作为控制台 winform 作业 当前的解决方案使用字符串生成器 在将 ASP NET MVC 与强类型视图页面 System Web Mvc ViewPage 一起使用后 我想知道是否可以利用这些视图页面
  • 为什么 JavaScript 中 (true > null) 总是返回 true?

    有人能告诉我为什么下面的代码在 JavaScript 中返回 true 吗 console log true gt null returns true null就好像false在这种情况下 即0作为一个数字 true is 1作为一个数字
  • C++自由实现“有界优先级队列”

    我正在寻找一个免费软件实现有界优先级队列C 中的抽象 基本上 我需要一个数据结构 其行为就像std priority queue但始终保持着 最好的 n最多元素 Example std vector
  • mysql 在where条件下使用按列分组

    我怎样才能使这个查询工作 SELECT column1 SUM Hits AS Hits FROM table WHERE SUM Hits gt 100 GROUP BY column1 问题出在where子句上 mysql显示错误 Er
  • 列出 git post-merge hook 中更改的文件

    有没有办法让合并后挂钩获取合并更改的所有文件的列表 即使它是快进 列出已更改文件的正确 Git 命令是diff tree https git scm com docs git diff tree 还有ORIG HEAD and HEAD 捷
  • Tensorboard(PyTorch)add_graph 中的错误

    我正在关注这个 Pytorch 的张量板 https pytorch org docs stable tensorboard html文档 我有以下代码 model torchvision models resnet50 False wri
  • 使用 SSIS 2008 将 Excel 导入 SQL 时跳过行

    我需要导入如下所示的工作表 March Orders Empty Row Week Order Date Cust 3 1 271356 3 3 10 010572 3 1 280353 3 5 10 022114 3 1 290822 3
  • 检测 Windows 进程和应用程序是否正在运行

    我正在调查是否有一种方法可以以编程方式检查某个进程是否作为进程运行 在运行的 exe 列表中 AND作为打开的应用程序 即在任务栏上 并根据结果采取行动 另外 有没有办法以编程方式终止进程OR正在运行的应用程序 我们正在该服务器上运行 WA
  • WordPress URL 不返回 404 页面

    在遭受黑客攻击后 我需要一些有关 WordPress 的帮助 我已经彻底清除了黑客攻击 谷歌也删除了 该网站可能被黑客入侵 flag 黑客向 Google 提交了大量 URL 其中每个有效 URL 的末尾都包含一个随机字符串 这些在谷歌搜索
  • 使用通用约束时如何使用继承

    当我尝试实现一个允许继承的库并希望有人可以提供帮助时 我正在努力解决一些通用约束问题 我正在尝试构建一个具有 3 种风格的类库 每种风格都构建在另一种之上 对我来说 这似乎是使用泛型的绝佳机会 因为我无法通过纯继承来做我想做的事情 代码如下
  • Linq & String.ToLower() 奇怪的行为

    我在服务器端有一个查询 它从邮政编码表中返回不同城市的列表 我正在使用 WCF RIA 服务 以下查询成功返回 228 个城市provincename public IQueryable
  • OS X 中的 GNU 链接器等效命令

    我正在阅读下面的书 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于操作系统 在第 43 页中 他们使用以下命令将带注释的机器代码转换为原始机器代码文
  • 如何将 3 个 DIV 彼此对齐?

    我需要在页脚容器 DIV 中创建 3 个 DIV 分别左对齐 中对齐和右对齐 我见过的所有 CSS 示例都像我一样使用了浮动 但是 由于某种原因 DotNetNuke 无法正确解析 CSS 我发现左侧窗格正确浮动 但右侧和中间窗格位于其正下
  • 验证可执行文件的 Authenticode 签名时内存泄漏?

    我在用Win验证信任 http msdn microsoft com en us library aa388208 v VS 85 aspx使用以下函数验证某些 Windows 可执行文件的有效性 该函数在循环中调用 tmain int s
  • Vue JS 将数据从父级传递给子级的子级

    在Vue js中 如何正确地将数据从父组件传递到多级子组件链 您有几个选择 Props https v2 vuejs org v2 guide components props html 活动总线 https css tricks com
  • 在 Python 中停止 Lambda 函数

    在某个函数内 我想停止整个 Lambda 进程 但不触发错误 我尝试查看上下文变量来阻止它或只是调用exit 但每次它都被视为我不想跟踪的错误 如何在 Python 中成功结束 Lambda 进程 在 AWS Lambda 中 您定义一个h
  • Vim 缓冲区已被修改[重复]

    这个问题在这里已经有答案了 我正在尝试实施一个AutoCmd在 Vim 中 需要在当前缓冲区被修改时执行 我已阅读所有可用的事件AutoCmd在文档中 但找不到有助于确定缓冲区何时被修改的内容 这并不一定意味着 写入缓冲区时 因为我需要触发
  • 分配器感知的容器分配是如何实现的?

    例如 从std deque 运算符 在 C 参考中 1 复制分配 const std deque 及其他 将内容替换为其他内容的副本 如果 std allocator traits propagate on container copy a