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

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(使用前将#替换为@)

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

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 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