是否可以在专用内存空间中分配用于增强托管共享内存的对象?

时间:2018-07-20 08:48:46

标签: c++ boost shared-memory allocator

比方说,我定义了一个用于增强共享内存的向量。创建它时,我必须从managed_shared_memory中分配一个分配器,这很有意义。

如果我想使用相同的向量类型,但不将其分配在共享内存中,而是将其分配在标准进程内存空间中。

是否可以通过给对象分配不同的分配器?

我是否必须更改向量的定义才能接受两种实现?

这是不可能的事,所以我应该改用另一种向量?

我要修复的示例代码:

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>

using namespace boost::interprocess;

typedef managed_shared_memory::segment_manager SegmentMgr;
typedef allocator<int, SegmentMgr> IntAlloc;
typedef vector<int, IntAlloc> IntVector;

int main()
{
  shared_memory_object::remove("Boost");
  managed_shared_memory managed_shm{ open_or_create, "Boost", 1024 };
  IntAlloc intAlloc = managed_shm.get_segment_manager();
  IntVector vectorInSharedMemory({}, intAlloc);  // <--- this allocates in shared memory
  IntVector vectorInMyOwnPrivateMemorySpace({}, /* ? */); // <--- is there a trick here ?
  return 0;
}

3 个答案:

答案 0 :(得分:1)

是的。之前,我已经给出了扩展的答案:

  

您所谓的“私有内存”是“本地堆”。您还可以使用MAP_PRIVATE映射内存,这意味着其他内容(请参见mmap和例如Opening managed shared memory and mapped files with Copy On Write or Read Only modes

答案 1 :(得分:1)

  

我想使用相同的向量类型,但不要在共享内存中分配

让我们停在那儿。它不再是同一个向量。假设分配器是vector的模板参数,则不同的分配器意味着不同的类型。

简单地说std::vector<int>和std :: vector<double>甚至不是同一类型。

  

我是否必须更改向量的定义才能接受两种实现?

是的,您可以使用别名声明来指定IntVector是参数化分配器的int向量。

template<typename Alloc> using IntVector=vector<int, Alloc>; // template definition

//    [...]

IntVector<IntAlloc> sharedMemoryVector;
IntVector<std::allocator<int>> localHeapVector;

答案 2 :(得分:1)

您需要创建一个分配器类,可以在运行时切换该分配器类以使用任一分配器。例如。像这样的东西(不是一个完整的示例,只是为了给您一个想法):

template < typename T >
class switchable_allocator
{
   boost::interprocess::allocator< T, SegmentMgr >* sharedAllocator;
   std::allocator< T > privateAllocator;

public:
   switchable_allocator(boost::interprocess::allocator< T, SegmentMgr >* sharedAllocator) : sharedAllocator(sharedAllocator) {}

   pointer allocate(size_t n)
   {
     if (sharedAllocator)
     {
       return sharedAllocator->allocate(n);
     }
     return privateAllocator.allocate(n);
   }
};