总之,我的问题是:如果你有类,MyClass<T>,你怎么能更改类定义支持,你必须MyClass<T, Alloc>情况下,类似于如何,比方说,STL载体提供。

予需要此功能以支持用于共享存储器的分配。具体地讲,我试图实现在共享存储器中的环形缓冲器。目前,它具有以下的构造函数:

template<typename ItemType>
SharedMemoryBuffer<ItemType>::SharedMemoryBuffer( unsigned long capacity, std::string name )

其中ItemType在数据的类型被放置在缓冲器中的每个时隙。

现在,这个当我从而创建从主程序中的缓冲器工作灿烂

SharedMemoryBuffer<int>* sb;
sb = new SharedMemoryBuffer<int>(BUFFER_CAPACITY + 1, sharedMemoryName);

然而,在这种情况下,缓冲器本身未在共享存储器中创建,因此不给其他进程访问。我想要做的是能够做到像

typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;
typedef SharedMemoryBuffer<int, ShmemAllocator> MyBuffer;

managed_shared_memory segment(create_only, "MySharedMemory", 65536);
const ShmemAllocator alloc_inst (segment.get_segment_manager());
MyBuffer *mybuf = segment.construct<MyBuffer>("MyBuffer")(alloc_inst);

不过,我不知道如何去增加一个明确分配给类模板。

有帮助吗?

解决方案

什么让我搞不清是,为什么你需要的,如果你预留大小65536个字节的共享内存来分配或创建共享内存(SHM)的对象,例如,那么假设你在地址0x1ABC0000得到您的共享内存,如果预订成功,你将在0x1ABC0000 to 0x1ABCFFFF有自由和直接访问内存空间。

那么当你的应用程序需要在尺寸sizeof(SHMObject)的SHM为“分配”的对象,你的内存管理器看到0x1ABC0000+0x1A该地址是免费的,您的内存管理器应该原封不动地返回0x1ABC001A值,并标记( 0x1ABC001A to 0x1ABC001A+sizeof(SHMObject) )被占领,而你只需要投:SHMObject* shmObjectPtr = (SHMObject*)(0x1ABC001A);

和ofcourse这是假设你有你自己的自定义的内存分配器,内存地址的指定范围内工作。

作为模板,我真的不明白请问你的SHM环形缓冲区的样子,但我已经做了,使用前SHM,我的实现是这样的: `

//memory SHM allocator
template<typename T> class ShmRingAllocator
{
    protected:
        void* baseAddress;
    public:
        ShmRingAllocator(void* baseAddress,int memSize);
        void* allocate(); //this function do what I described earlier, or you can use placement new: new (baseAddress+offset)T;
}

//some kind of shared_ptr<> that handle object in SHM, this provides mechanishm to check is the pointer still valid in shm or not
template<typname T> ShmRingObjectPtr 
{
    protected:
         T* object; //mapped address of object at current process
         ShmBuffer* shm; //every object has pointer to which SHM does this pointer pointing at
    public:
         virtual T* operator->(); //operator overload to access T object
}

class ShmBuffer //base class for all kind of SHM buffer
{
    protected:
         std::string shmName;
         void* shmBasePtr;
}

template<typename T,class A=ShmRingAllocator<T>> ShmRingBuffer : public ShmBuffer
{
    protected:
         A allocator;
    public:
         ShmRingObjectPtr<T> insert() //push one element to ring buffer
         {
              return ShmRingObjectPtr<T>((T*)this->allocator.allocate(),this);
         }
}

`

其他提示

我认为你只是在寻找标准的放置新的的。

如果shm_addrvoid*指针共享存储器可以这样做:

MyBuffer *pBuf = new (shm_Addr) MyBuffer;

和新MyBuffer将在给定的位置来构造。这可以用任何类型的对象进行操作,其中包括模板类型。

您可以在一个单独的功能,如果你认为合适这个包起来。

要摧毁标准的放置新创建的东西的你需要显式调用析构函数。这是因为delete会尽力去分配内存作为常规new分配的内存这不会是一个有效的事情。这是在C ++中唯一的一次,你需要显式调用析构函数。

pBuf->~MyBuffer();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top