std::vector 是否满足 Boost.Interprocess 分配器的容器要求?

2024-01-28

In boost::interprocess文档称容器存储在共享内存中的要求:

  1. STL容器可能不会假设用分配器分配的内存可以用相同类型的其他分配器释放。仅当一个对象分配的内存可以与另一个对象一起释放时,所有分配器对象才必须比较相等,并且只能使用以下命令进行测试operator==()在运行时。
  2. 容器的内部指针应该是以下类型allocator::pointer并且容器可能不会假设allocator::pointer是一个原始指针。
  3. 所有对象都必须通过以下方式构造-销毁allocator::construct and allocator::destroy功能。

我使用 gcc 4.7.1 和 -std=c++11 (和 boost 1.53)。使用以下定义是否安全ShmVector type?

typedef boost::interprocess::allocator<int,
    boost::interprocess::managed_shared_memory::segment_manager>  ShmemAllocator;
typedef std::vector<int, ShmemAllocator> ShmVector;

我尝试了一个使用这种类型的虚拟进程,看起来它正在工作,但我仍然不确定 gcc4.7.1 中的向量是否满足所有要求。我尤其不确定第一个要求。

#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <vector>
#include <cstdlib> //std::system

typedef boost::interprocess::allocator<int,
        boost::interprocess::managed_shared_memory::segment_manager>  ShmemAllocator;
typedef std::vector<int, ShmemAllocator> ShmVector;

int main(int argc, char *argv[])
{
    if(argc == 1){ //Parent process

        struct shm_remove
        {
            shm_remove() { boost::interprocess::shared_memory_object::remove("MySharedMemory"); }
            ~shm_remove(){ boost::interprocess::shared_memory_object::remove("MySharedMemory"); }
        } remover;

        //Create a new segment with given name and size
        boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only,
                "MySharedMemory", 65536);

        //Initialize shared memory STL-compatible allocator
        const ShmemAllocator allocator(segment.get_segment_manager());

        ShmVector* v = segment.construct<ShmVector>("ShmVector")(allocator);
        v->push_back(1); v->push_back(2); v->push_back(3);

        //Launch child process
        std::string s(argv[0]); s += " child ";
        if(0 != std::system(s.c_str()))
            return 1;

    } else { // Child process

        //Open the managed segment
        boost::interprocess::managed_shared_memory segment(
                boost::interprocess::open_only, "MySharedMemory");

        //Find the vector using the c-string name
        ShmVector *v = segment.find<ShmVector>("ShmVector").first;

        for (const auto& i : *v) {
            std::cout << i << " ";
        }
        std::cout << std::endl;

    }
}

在 C++ 11 分配器规则中略有变化,但我认为它不会影响你的问题。

您可能想首先了解标准对此有何规定。但您实际上想要检查您的特定 STL 实现是否符合标准并且不包含错误。

对于第二部分,我强烈建议您查看来源并进行检查,实际上并不那么难。

另外,您可以编写测试来查看它是否确实正常工作:

  • Create custom allocator:
    • 使用一些自定义类型作为指针,const指针;
    • In construct(), destruct()计算呼叫次数;
  • Create YourCustomType与分配器一起使用,分配器还计算构造/销毁的数量。
  • Now, create std::vetor<YourCustomType, YourCustomAllocator<YourCustomType>> instance, insert some elements, clear the vector, destroy it and see if:
    • 数量construct() destruct()调用等于构造破坏的数量YourCustomType.
    • typeid(YourCustomAllocator::pointer) == typeid(std::vetor<YourCustomType, YourCustomAllocator<YourCustomType>>::pointer)

这样您就可以确保所有限制均适用。

至于问题的第一部分,这是一个旧的 C++ 标准 http://www.csci.csusb.edu/dick/c++std/cd2/lib-containers.html(不是 C++ 11)。

1(正确实现的)向量不可能凭空获取分配器。它将使用您提供的任何分配器,并将其用于所有事情。至于operator==,它是在boost的分配器中实现的,因此让operator==按要求工作是boost的问题。虽然我无法在其中找到确认信息standard http://www.csci.csusb.edu/dick/c++std/cd2/lib-containers.html.

2除非有bugstd::vector<T, YourAllocator>::pointer应该是分配器的指针。cppreference.com 说 http://en.cppreference.com/w/cpp/container/vector,以及标准说 http://www.csci.csusb.edu/dick/c++std/cd2/lib-containers.html,(查找“模板类向量”):

    typedef typename Allocator::pointer               pointer;
    typedef typename Allocator::const_pointer         const_pointer;

虽然相同的标准是这样说的分配器 http://www.csci.csusb.edu/dick/c++std/cd2/lib-utilities.html#lib.allocator.requirements: 本国际标准中描述的容器的实现 允许假设他们的分配器模板参数满足 除表 6 中的要求外,还需满足以下两项附加要求。

--给定分配器类型的所有实例都需要相互连接 变化无常,并且总是相互比较。

--typedef 成员指针、const_pointer、size_type 和 diff- ence_type 必须为 T*、T const*、size_t 和 ptrdiff_t, 分别。

因此,实际上标准不允许使用任何指针类型,但我的猜测是实际的 STL 实现会起作用。

3只需检查std::vector<T>::clear()方法实现以查看是否调用了 allocator::destroy。查看std::vector<T>::resize()方法的实现以查看是否使用了 allocator::construct。我无法找到调用销毁和构造的要求标准 http://www.csci.csusb.edu/dick/c++std/cd2/lib-containers.html.

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

std::vector 是否满足 Boost.Interprocess 分配器的容器要求? 的相关文章

  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 将非算术类型作为参数传递给 cmath 函数是否有效?

    给定以下用户定义类型S具有转换功能double struct S operator double return 1 0 以及以下调用cmath http en cppreference com w cpp header cmath使用类型的
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat

随机推荐

  • 有两个输入的表单未提交?

    有人可以解释一下为什么这段代码不起作用 form on submit function e e preventDefault var first first val var next next val alert first next ht
  • 数据库中的原子比较和交换

    我正在研究工作排队解决方案 我想查询数据库中的给定行 其中状态列具有特定值 修改该值并返回该行 并且我想以原子方式执行此操作 以便其他查询不会看到它 begin transaction select from table where pk
  • 如何将我的数据随机分成不同的小批量 [JULIA]

    我有一个包含 100000 个示例的数据向量 值为 1 和 1 我想从这个数据中得到16 个不同的小批量随机 每6250个 这是我的代码 用于生成 100000 个示例的向量 并将其存储在文件中 Dan 回答了如何将我的数据划分为不同部分的
  • Reporting Services 2005 部署错误:无法加载文件或程序集

    我制作了一份关于 Reporting Services 2005 的报告 该报告使用外部程序集 我将该程序集添加到项目中 报告 报告属性 参考 我还将程序集复制到文件夹中 C Program Files Microsoft SQL Serv
  • hive 在一定数量后自动递增

    我需要将数据插入目标表 其中除代理键列外 所有列都应从不同的源表填充 它应该是目标表的最大值加上从 1 开始的自动增量值 我可以使用 row number 函数生成自动增量值 但在同一个查询中 我应该如何从目标表获取代理键的最大值 HIVE
  • Windows Metro 应用程序中的 CollectionViewSource

    我有一个集合 我需要 3 个不同的视图1 收集所有数据2 分组数据 分组标准将在应用程序生命周期中修改 3 过滤数据 过滤条件将在应用生命周期中修改 我想要的是所有视图都应该绑定到同一个集合 以便对集合的任何更改都应该同步到所有视图 对于
  • 访问 Service Fabric 中的文件系统

    当我从服务总线队列收到新消息时 我需要在 Service Fabric 服务中使用 ffmpeg 对视频进行编码 我可以从资源中提取 ffmpeg exe 并运行它 但我可以将输入 输出视频文件保存在内部文件系统中吗 我通过以下代码在本地集
  • 用于监视下载文件夹添加内容的批处理文件

    我需要一个批处理文件来监视 下载 文件夹中的添加内容 但仅限于新添加的内容 像这样的事情 START NumOldFiles GetNumberOfFilesOld Delay 30 Seconds NumNewFiles GetNumbe
  • ec2 API 如何决定哪个可用区?

    我正在编写一项服务 该服务可以根据需要以编程方式启动 EC2 实例 我想给它最好的机会能够随时启动实例 最大限度地减少由于容量不足而导致的失败 实例在一个区域内的哪个可用区中运行并不重要 重要的是我有最好的机会启动实例 我想知道 如果我在使
  • 什么正则表达式模式将匹配包含某些字符的整个单词?

    我想匹配包含某些字母 字符的整个单词 例如 该模式将匹配包含该字母的所有单词l and a 例如car patrol left等等 但它不会匹配这样的词boom turnover digit etc 像这样的模式应该有效 b w al w
  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC

    我需要帮助在 Java 中使用多项式 x 16 x 12 x 5 1 0x1081 计算 CCITT 标准 CRC 我在互联网上尝试了很多示例 但每个示例都返回与示例中不同的值 例如 对于此数组 0xFC 05 11 结果需要为 27 56
  • Android:有什么好的解决方案如何验证编辑框

    例如 我想要验证最小长度 如果是Email a PhoneNumber 这在安卓中怎么可能 我想验证一下 如果您想阻止用户输入某些内容 请扩展InputFilter并将其注册到您的EditText built in InputFilter
  • 如何使用 TWGL(WebGL 辅助库)绘制 2D 图像

    有很多关于如何使用 TWGL 绘制 3D 内容的示例https github com greggman twgl js tree master examples https github com greggman twgl js tree
  • 在c中对二维数组进行排序

    我正在尝试对二维数组进行排序 原始数组是 5 0 3 4 1 2 3 1 1 4 2 2 3 3 1 排序后 应该是这样的 3 1 1 3 3 1 4 2 2 4 1 2 5 0 3 这是我用来尝试实现冒泡排序的代码 i 代表行数 int
  • JMeter 3.2 中不存在 SOAP/XML-RPC Sampler

    我有点惊讶我的 JMeter 3 1 脚本在 3 2 中不起作用 JMeter 3 2 中删除 SOAP XML RPC Sampler 的原因是什么 是否存在一些性能问题等 这是 JMeter 的一部分change http jmeter
  • 在 Windows 窗体应用程序中托管 ASP.NET Core API

    背景 我正在开发一个涉及 WinForms 应用程序的项目 客户端希望公开一个仅限本地的 HTTP 服务器 以允许其他应用程序通过 REST API 或类似 API 触发正在运行的 WinForms 应用程序实例上的功能 首选是使用 ASP
  • UIWebview、iOS 中的视频自动播放

    例如我有网址https www youtube com watch v c2ccXwwmcnA 如果我将此 URL 传递给UIWebView它会自动play视频 我尝试过以下方法 Option 1 property weak nonatom
  • 使用 for 循环初始化 C 结构

    我正在创建一个质量中心程序 并试图对其进行概括 它最多仅适用于 3D 使用具有 3D 和质量元素的结构 类型对象的变量数量 我希望由用户而不是我来定义 但我找不到使用循环创建变量的方法 也许有不同的方法可以做到这一点 但我只是不知道 这是我
  • Seam/JSF 表单提交触发按钮 onclick 事件

    我有一个带有查询生成器的搜索表单 构建器通过按钮激活 像这样的东西
  • std::vector 是否满足 Boost.Interprocess 分配器的容器要求?

    In boost interprocess文档称容器存储在共享内存中的要求 STL容器可能不会假设用分配器分配的内存可以用相同类型的其他分配器释放 仅当一个对象分配的内存可以与另一个对象一起释放时 所有分配器对象才必须比较相等 并且只能使用