追加アロケータにはC++のクラステンプレート用共有メモリ-オブジェクトを作成

StackOverflow https://stackoverflow.com/questions/2423270

  •  19-09-2019
  •  | 
  •  

質問

私の質問はだってクラス MyClass<T>,どのようにすることができます変更をクラス定義の支援のた場合、または MyClass<T, Alloc>, 同様にどのように乗り越えベクターを提供します。

この機能を支えるアロケータ共有メモリ。具体的に行うことにより実施するリングバッファの共有メモリ。現在のとしているため、以下のようなctor:

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);

しかし、わからないの手を加え明示的にアロケータのクラステンプレートを作成します。

役に立ちましたか?

解決

どくさかったの混乱は、なぜ必要な配分またはオブジェクトを作成し、SharedMemory(SHM)は、例えば予約する場合には共有メモリのサイズ65536バイトしまく共有メモリアドレス 0x1ABC0000, 場合、予約が成功まで無料でダイレクトアクセス可能なメモリ空間で 0x1ABC0000 to 0x1ABCFFFF.

その申請が必要"配分"のオブジェクトSHMのサイズ sizeof(SHMObject), と、メモリマネージャとアドレス 0x1ABC0000+0x1A は無料、メモリ管理すべきも 0x1ABC001A 値は、マーク ( 0x1ABC001A to 0x1ABC001A+sizeof(SHMObject) ) 占領された、すべてキャスト: SHMObject* shmObjectPtr = (SHMObject*)(0x1ABC001A);

や昇、雨などの天候による仮定およびユーザーインターフェイスのメモリアロケータが指定された範囲のメモリアドレスです。

としてのテンプレートはしないんかな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_addr aです void* あなたができる共有メモリへのポインター:

MyBuffer *pBuf = new (shm_Addr) MyBuffer;

そして新しい MyBuffer 指定された場所に建設されます。これは、テンプレートされたタイプを含むあらゆるタイプのオブジェクトで動作できます。

フィット感がある場合は、これを別の関数で包むことができます。

標準で作成されたものを破壊するため 新しい配置 Destructorを明示的に呼び出す必要があります。それの訳は delete メモリを通常のように脱アロッカ化しようとします new 有効なことを行うことはできないメモリを割り当てます。これは、Destructorを明示的に呼び出す必要があるC ++で唯一の時間です。

pBuf->~MyBuffer();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top