以下是在进程间共享内存中使用vector的官方示例:
但是我仍有一些担忧:
如果向量需要重新分配新内存(例如在几次push_back之后)会怎么样?
如果向量继续增加并最终消耗所有已初始化的内存会怎样?
通过与原始STL向量进行比较,性能损失是什么?
答案 0 :(得分:1)
它是通过自定义ShmemAllocator
完成的。这就是分配器的工作原理:你换掉了标准的堆分配器,它为Boost的共享内存段分配了一个调用new
。
与使用标准分配器耗尽内存的行为相同:将抛出异常(但不是std::bad_alloc
:而是apparently boost::interprocess::bad_alloc
代替。
您需要对Boost的分配器的分配速度进行基准测试,并将其与std::allocator
的分配速度进行比较,这是默认值。载体本身并不重要。
答案 1 :(得分:0)
这里有2个独立的实体
当您将vector
创建为
vector <int> v1;
实际上是
vector<int, allocator<int>> v1;
我们不提供任何内存分配器,因为它是defult分配器。
现在,在Boost.Interprocess
通信的情况下,矢量被创建为
typedef vector<int, ShmemAllocator> MyVector
将内存分配器从Default Allocator更改为Shared Memory Allocator。
因此,vector的功能与使用哪个内存分配器无关。
关于这些问题,内存的可用性和分配的速度取决于分配器而不是向量,只要分配器设法获得一些内存,向量将继续执行。