C++ 是否可以在私有内存空间中分配为boost托管共享内存制作的对象?

C++ 是否可以在私有内存空间中分配为boost托管共享内存制作的对象?,c++,boost,shared-memory,allocator,C++,Boost,Shared Memory,Allocator,假设我输入了一个向量,用于boost共享内存。在创建它时,我必须从托管共享内存中提供一个分配器,这很有意义 如果我想使用相同的向量类型,但是不在共享内存中分配它,而是在标准进程内存空间中分配它 是否可以为对象指定不同的分配器 我是否必须更改向量的定义才能接受这两种实现 这是不可能的,因此我应该使用另一种向量来代替吗 我正在尝试修复的示例代码: #include <boost/interprocess/managed_shared_memory.hpp> #include <bo

假设我输入了一个向量,用于boost共享内存。在创建它时,我必须从托管共享内存中提供一个分配器,这很有意义

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

是否可以为对象指定不同的分配器

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

这是不可能的,因此我应该使用另一种向量来代替吗

我正在尝试修复的示例代码:

#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;
}
#包括
#包括
#包括
使用名称空间boost::interprocess;
typedef受管_共享_内存::段管理器段管理器;
类型定义分配器IntAlloc;
typedef向量IntVector;
int main()
{
共享内存对象::删除(“Boost”);
托管共享内存托管shm{open_或_create,“Boost”,1024};
IntAlloc IntAlloc=managed_shm.get_segment_manager();

IntVector vectorInSharedMemory({},intAlloc);//是的。我之前已经对此给出了一个扩展的答案:

  • 接下来呢
你所谓的“私有内存”是“本地堆”。你也可以使用MAP_private来映射内存,这意味着其他东西(请参阅和,例如)


是的,我之前已经对此给出了详细的回答:

  • 接下来呢
你所谓的“私有内存”是“本地堆”。你也可以使用MAP_private来映射内存,这意味着其他东西(请参阅和,例如)

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

让我们到此为止。它不再是同一个向量了。由于分配器是向量的模板参数,不同的分配器意味着不同的类型

简单地说,std:
std::vector
和std:
vector
甚至不是同一类型

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

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

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

//    [...]

IntVector<IntAlloc> sharedMemoryVector;
IntVector<std::allocator<int>> localHeapVector;
使用IntVector=vector的模板;//模板定义
//    [...]
IntVector sharedMemoryVector;
IntVector localHeapVector;
我想使用相同的向量类型,但不在共享内存中分配它

让我们到此为止。它不再是同一个向量了。由于分配器是向量的模板参数,不同的分配器意味着不同的类型

简单地说,std:
std::vector
和std:
vector
甚至不是同一类型

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

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

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

//    [...]

IntVector<IntAlloc> sharedMemoryVector;
IntVector<std::allocator<int>> localHeapVector;
使用IntVector=vector的模板;//模板定义
//    [...]
IntVector sharedMemoryVector;
IntVector localHeapVector;

您需要创建一个分配器类,该类可以在运行时切换以使用任何一个分配器。例如,类似的内容(不是完整的示例,只是为了让您了解):

模板
类可切换分配程序
{
boost::进程间::分配器*sharedAllocator;
std::分配器私有分配器;
公众:
可切换的_分配器(boost::进程间::分配器*sharedAllocator):sharedAllocator(sharedAllocator){
指针分配(大小\u t n)
{
if(共享定位器)
{
返回SharedLocator->分配(n);
}
返回privateAllocator.allocate(n);
}
};

您需要创建一个分配器类,该类可以在运行时切换以使用任何一个分配器。例如,类似的内容(不是完整的示例,只是为了让您了解):

模板
类可切换分配程序
{
boost::进程间::分配器*sharedAllocator;
std::分配器私有分配器;
公众:
可切换的_分配器(boost::进程间::分配器*sharedAllocator):sharedAllocator(sharedAllocator){
指针分配(大小\u t n)
{
if(共享定位器)
{
返回SharedLocator->分配(n);
}
返回privateAllocator.allocate(n);
}
};

刚刚意识到,当您将托管段替换为可以放在任意位置(在本地堆或(共享)内存映射中)的时,您也可以吃蛋糕。这样,类型就可以完全相同。刚刚意识到,当您将托管段替换为可以放在任意位置(在本地堆或(共享)内存映射中)的时,您也可以吃蛋糕。这样,类型就可以相同。它们显示了另一个答案所描述的内容:将分配器添加为模板参数。(进入高级实践以避免每次调用都传递分配器。)它们显示了另一个答案所描述的内容:将分配器添加为模板参数。(进入高级实践以避免每次调用都必须传递分配器。)这是一种方法。请注意,出于性能原因,使分配器运行时多态可能不合适。这是一种方法。请注意,出于性能原因,使分配器运行时多态可能不合适。