カスタム ヒープ アロケータ: スマート ポインター内にキャッシュする必要がある派生のアドレス?

ジャバラバー

多くのカスタム ヒープ アロケータがある環境では、通常、元のアドレスをvoid*カスタム スマート ポインター内にキャッシュする必要がありますか?

後でAllo特定のメモリ ブロックのアロケータ ( )を識別するにはcontent:-
ブロックが割り当てられたら、その近くにハック情報 (meta-dataおよびAllo*)を格納する必要があると思います

ここに画像の説明を入力してください

割り当てを解除したいときはvoid*void*ポインタを差し引いてAllo*たとえば

template<class T>class StrongPointer{
    public: void* content;
    public: ~StrongPointer(){
        Allo* allo=static_cast<Allo*>((void*)(static_cast<char*>(content)-4));  
        //^ 32-bit system
        allo->deallocate(content);
    }
    public: void get(){ return static_cast<T*>(content); }
}

動作するはずです。

ただし、これはキャストをサポートしたいときに壊れますStrongPointer<Derived>-> StrongPointer<Base2>
( MI(多重継承)のC++仮想テーブルレイアウトによる)

class Base1{/*some fields */};
class Base2{/*some fields */};
class Derived : public Base1,public Base2{};

たとえば、willをキャストStrongPointer<Derived>た結果はもはやの場所のすぐ隣にはありません。StrongPointer<Base2>StrongPointer<Base2>::contentAllo*

ここに画像の説明を入力してください

template<class T1,class T2> StrongPointer<T2> cast(StrongPointer<T1>&& t1){
    StrongPointer<T2> r;
    r.content=static_cast<T2*>(t1.get());
    //^ location change, so "content-(4 bytes)" doesn't point to Allo* anymore
    return r;
} 

質問

私の意見では、いくつかの回避策があります。

  • Allo*すべての強力なポインター内に格納します。または
  • キャストごとに +/- のオフセットを保存する OR
  • Allo* + 1割り当てられたコンテンツの実際のアドレスを反映するストア

それはすべて次のように要約されます。-
本当に別の変数を内部に保存する必要がありStrong_Pointer<T>ますか

n. 「代名詞」 M.

これは、邪魔にならず、次のようなファット ポインターを使用せずにこれを整理する方法shared_ptrです (ファット ポインターが問題ない場合はshared_ptr、 を使用するだけですが、それらを避けたいと思います)。この例では、カスタム スマート ポインターを使用していません。どんな種類のポインターでも使用できます。カスタム アロケータを使用する場合は、常に「make」関数を使用することだけを覚えておく必要があります。

#include <cstdlib>
#include <cstddef>
#include <iostream>
#include <memory>
#include <cstring>

// メタデータ

struct Alloc;

struct UnalignedControlBlock
{
    int magic1;
    Alloc* allocator;
    std::size_t size;
    char magic2[19];
};

union ControlBlock
{
    UnalignedControlBlock ucb;
    std::max_align_t aligner;
};

// アロケータ

struct Alloc
{
    static Alloc global_allocator;

    static void* allocate(std::size_t size)
    {
        void* p = ::operator new (size + sizeof(ControlBlock));
        ControlBlock* cb = static_cast<ControlBlock*>(p);
        cb->ucb.allocator = &global_allocator;
        cb->ucb.magic1 = 42;
        cb->ucb.size = size;
        std::strcpy(cb->ucb.magic2, "Hey there!");
        std::cout << "Allocate: block: " << cb << " size: " << size << " magic1: " << cb->ucb.magic1 << " magic2: " << cb->ucb.magic2 << " allocator: " << cb->ucb.alloca
        return cb+1;
    }

    static void deallocate (void* p)
    {
        ControlBlock* cb = static_cast<ControlBlock*>(p);
        cb--;
        std::cout << "Deallocate: block: " << cb << " size: " << cb->ucb.size << " magic1: " << cb->ucb.magic1 << " magic2: " << cb->ucb.magic2 << " allocator: " << cb->u
        ::operator delete (cb);
    }
};

// カスタムの new および delete 演算子の所有者 (魔法が発生する場所)

template <class T>
struct Allocated : T
{
    template <class ... Arg>
        Allocated(Arg ... arg) : T(arg ...) {}
    void* operator new (size_t size) { return Alloc::allocate(size); }
    void  operator delete (void* p) { return Alloc :: deallocate(p); }
};

// make 関数 (自分のスマート ポインターを返す)

template <class T, class ... Args>
std::unique_ptr<T> make_smart (Args ... args)
{
    return std::unique_ptr<T>(new Allocated<T>(args...));
};

// 試乗

struct Test1
{
    const int filler = 42;
    virtual ~Test1() {
       std::cout << "Test1::~Test1 " << this << " " << filler << std::endl;
    }
};

struct Test2 : virtual Test1
{
    const int filler = 43;
    virtual ~Test2() {
       std::cout << "Test2::~Test2 " << this << " " << filler << std::endl;
    }
};

struct Test3 : virtual Test1
{
    const int filler = 44;
    virtual ~Test3() {
       std::cout << "Test3::~Test3 " << this << " " << filler << std::endl;
    }
};

struct Test4 : Test2, Test3
{
    const int filler = 45;
    virtual ~Test4() {
       std::cout << "Test4::~Test4 " << this << " " << filler << std::endl;
    }
};


Alloc Alloc::global_allocator;

int main ()
{
    std::unique_ptr<Test1> p1 = make_smart<Test1>();
    std::unique_ptr<Test1> p2 = make_smart<Test2>();
    std::unique_ptr<Test1> p3 = make_smart<Test3>();
    std::unique_ptr<Test1> p4 = make_smart<Test4>();
}

テスト出力

Allocate: block: 0x1817c20 size: 16 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Allocate: block: 0x1818080 size: 32 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Allocate: block: 0x18180e0 size: 32 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Allocate: block: 0x1818140 size: 48 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Test4::~Test4 0x1818170 45
Test3::~Test3 0x1818180 44
Test2::~Test2 0x1818170 43
Test1::~Test1 0x1818190 42
Deallocate: block: 0x1818140 size: 48 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Test3::~Test3 0x1818110 44
Test1::~Test1 0x1818120 42
Deallocate: block: 0x18180e0 size: 32 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Test2::~Test2 0x18180b0 43
Test1::~Test1 0x18180c0 42
Deallocate: block: 0x1818080 size: 32 magic1: 42 magic2: Hey there! allocator: 0x6052e9
Test1::~Test1 0x1817c50 42
Deallocate: block: 0x1817c20 size: 16 magic1: 42 magic2: Hey there! allocator: 0x6052e9

これは、継承用に調整されたポインターからの正しいメタデータの回復を示しています。デストラクタが仮想の場合、カスタムのデリータは必要ありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

スタンドアロンの Laravel キャッシュ インスタンスにカスタム キャッシュ ドライバーを追加する

分類Dev

カスタムアプリケーションでAndroidパターンロック画面を使用するための実用的なソリューションが必要です(ソースコードのリダイレクトではありません)

分類Dev

カスタムアノテーションSeabornヒートマップ

分類Dev

Googleインドアアプリケーションにアップロードする必要があるフロアプレーンのタイプ

分類Dev

カスタムポインタタイプのメモリアロケータ

分類Dev

パンダのデータフレームからカスタムヒートマップを作成する

分類Dev

D3フロアプランカスタムカラーヒートマップ

分類Dev

Seabornヒートマップ、カスタムティック値

分類Dev

MESIキャッシュコヒーレンスプロトコルでは、データをメモリからフェッチする必要がある場合、キャッシュラインの状態はいつ正確に変更されますか?

分類Dev

Seabornカスタム範囲ヒートマップ

分類Dev

カテゴリ変数のカスタムカラーヒートマップ

分類Dev

マルチオートコンプリートテキストビューをalertdialog内の追加ボタンの上でスクロール可能にし、このタイプのカスタムアラートダイアログが必要です

分類Dev

プロットヒートマップのホバーテキストをカスタマイズする

分類Dev

ワーカースレッドのラムダにキャプチャされたベクターのリスト内の要素の参照にアクセスするときにミューテックスが必要ですか?

分類Dev

カスタムアロケータによる基本タイプのオーバーロードとその代替

分類Dev

共有ポインター用のカスタムアロケーターが必要ですか?

分類Dev

コード内のAmazonEMRブートストラップアクションにカスタムパッケージをインストールする方法は?

分類Dev

カスタムアカウントがクラッシュするアプリケーションプール

分類Dev

カスタムテキストをヒートマップに挿入する方法はありますか?2?

分類Dev

Rでプロットヒートマップのカスタムカラースケールを生成する方法

分類Dev

同じ派生クラスインスタンスへのポインタを仮想ベースポインタにアップキャストすると、常に同じアドレスが返されますか?C ++

分類Dev

カスタムアロケータのパフォーマンス

分類Dev

カスタムコンストラクターでヒープ上にポインターを作成する

分類Dev

ユーザーが各ステップでドロップするjmeterを介してeコマースアプリケーションのリアルタイムトラフィックをシミュレートできますか?

分類Dev

カスタムUncaughtExceptionHandlerを使用してFirebaseクラッシュレポートとカスタムアプリケーションクラスを処理する

分類Dev

カスタムレイアウトマネージャーのスクロール/アニメーション

分類Dev

カスタムマーケットプレイスカタログの日食を統合する

分類Dev

カスタムマーケットプレイスカタログの日食を統合する

分類Dev

インターネットにアクセスできるローカル サーバーを介して、クラウド上のプライベート仮想マシンからインターネットに接続する必要がある

Related 関連記事

  1. 1

    スタンドアロンの Laravel キャッシュ インスタンスにカスタム キャッシュ ドライバーを追加する

  2. 2

    カスタムアプリケーションでAndroidパターンロック画面を使用するための実用的なソリューションが必要です(ソースコードのリダイレクトではありません)

  3. 3

    カスタムアノテーションSeabornヒートマップ

  4. 4

    Googleインドアアプリケーションにアップロードする必要があるフロアプレーンのタイプ

  5. 5

    カスタムポインタタイプのメモリアロケータ

  6. 6

    パンダのデータフレームからカスタムヒートマップを作成する

  7. 7

    D3フロアプランカスタムカラーヒートマップ

  8. 8

    Seabornヒートマップ、カスタムティック値

  9. 9

    MESIキャッシュコヒーレンスプロトコルでは、データをメモリからフェッチする必要がある場合、キャッシュラインの状態はいつ正確に変更されますか?

  10. 10

    Seabornカスタム範囲ヒートマップ

  11. 11

    カテゴリ変数のカスタムカラーヒートマップ

  12. 12

    マルチオートコンプリートテキストビューをalertdialog内の追加ボタンの上でスクロール可能にし、このタイプのカスタムアラートダイアログが必要です

  13. 13

    プロットヒートマップのホバーテキストをカスタマイズする

  14. 14

    ワーカースレッドのラムダにキャプチャされたベクターのリスト内の要素の参照にアクセスするときにミューテックスが必要ですか?

  15. 15

    カスタムアロケータによる基本タイプのオーバーロードとその代替

  16. 16

    共有ポインター用のカスタムアロケーターが必要ですか?

  17. 17

    コード内のAmazonEMRブートストラップアクションにカスタムパッケージをインストールする方法は?

  18. 18

    カスタムアカウントがクラッシュするアプリケーションプール

  19. 19

    カスタムテキストをヒートマップに挿入する方法はありますか?2?

  20. 20

    Rでプロットヒートマップのカスタムカラースケールを生成する方法

  21. 21

    同じ派生クラスインスタンスへのポインタを仮想ベースポインタにアップキャストすると、常に同じアドレスが返されますか?C ++

  22. 22

    カスタムアロケータのパフォーマンス

  23. 23

    カスタムコンストラクターでヒープ上にポインターを作成する

  24. 24

    ユーザーが各ステップでドロップするjmeterを介してeコマースアプリケーションのリアルタイムトラフィックをシミュレートできますか?

  25. 25

    カスタムUncaughtExceptionHandlerを使用してFirebaseクラッシュレポートとカスタムアプリケーションクラスを処理する

  26. 26

    カスタムレイアウトマネージャーのスクロール/アニメーション

  27. 27

    カスタムマーケットプレイスカタログの日食を統合する

  28. 28

    カスタムマーケットプレイスカタログの日食を統合する

  29. 29

    インターネットにアクセスできるローカル サーバーを介して、クラウド上のプライベート仮想マシンからインターネットに接続する必要がある

ホットタグ

アーカイブ