【问题标题】:can boost::managed_shared_memory handle vector correctly?boost::managed_shared_memory 可以正确处理向量吗?
【发布时间】:2017-01-16 09:03:20
【问题描述】:

这是在进程间共享内存中使用vector的官方示例:

http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container

不过我还是有些担心:

  1. 如果向量需要重新分配新的内存(例如,在几次 push_back 之后)怎么办?

  2. 如果向量不断增加,最终耗尽所有初始化的内存怎么办?

  3. 与原始 STL 向量相比,性能损失是多少?

【问题讨论】:

  • 不想推送我自己的答案,但我有 /many/ 使用 Boost Interprocess 的答案显示了使用(范围/级联)分配器为您的(嵌套)正确执行所有这些操作的优势(容器)类

标签: c++ vector boost stl


【解决方案1】:
  1. 它通过自定义 ShmemAllocator 来实现。这就是分配器的工作原理:您将调用 new 的标准堆分配器换成 Boost 从共享内存段分配的堆分配器。

  2. 与使用标准分配器耗尽内存的行为相同:将引发异常(不是std::bad_alloc,而是apparently boost::interprocess::bad_alloc)。

  3. 您需要对 Boost 的分配器的分配速度进行基准测试,并将其与默认的 std::allocator 进行比较。矢量本身并不重要。

【讨论】:

    【解决方案2】:

    这里有两个独立的实体

    1. 矢量
    2. 分配器

    当你创建vector

    vector <int> v1;
    

    其实是

    vector<int, allocator<int>> v1; 
    

    我们不提供任何内存分配器,因为它是默认分配器。

    现在在Boost.Interprocess通信的情况下,向量被创建为

    typedef vector<int, ShmemAllocator> MyVector
    

    内存分配器从默认分配器更改为共享内存分配器。

    因此,vector 的功能与使用的内存分配器无关。

    关于这些问题,内存的可用性和分配的速度取决于分配器而不是向量,只要分配器设法获得一些内存,向量就会继续执行。

    【讨论】:

    • 从技术上讲,Boost.Interprocess boost::interprocess::vector&lt;T&gt;boost::container::vector&lt;T, boost::interprocess::allocator&lt;T&gt;&gt; 的 typedef(不是 std::vector&lt;T, bip::allocator&lt;T&gt;&gt;)。我认为 STL 向量的可定制性不足以处理偏移指针offset_ptr
    猜你喜欢
    • 2019-11-25
    • 2019-01-23
    • 2011-01-11
    • 1970-01-01
    • 2019-05-01
    • 2015-07-02
    • 2023-03-20
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多