比方说,我定义了一个用于增强共享内存的向量。创建它时,我必须从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;
}
答案 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);
}
};