4

http://msdn.microsoft.com/en-us/library/ee292117.aspxhttp://msdn.microsoft.com/en-us/library/ee292134.aspxで、Microsoftが特殊なマクロとクラスを提供していることがわかります。アロケータですが、各キャッシング戦略が何であるか、それらをどのように使用するかはわかりません。誰かがこれらの各パーツをいつ使用するかを説明できますか?

  • キャッシュテンプレート
    • cache_freelist-cache_freelistテンプレートクラスは、サイズのメモリブロックの空きリストを維持しますSz。フリーリストがいっぱいになると、operator deleteメモリブロックの割り当てを解除するために使用されます。フリーリストが空の場合、operator new新しいメモリブロックを割り当てるために使用されます。フリーリストの最大サイズはmax class、パラメータで渡されたクラスによって決まりMaxます。各メモリブロックはSz、使用可能なメモリのバイトと、必要なデータをoperator new保持しますoperator delete
    • cache_suballoc-cache_suballocテンプレートクラスは、を使用して、割り当て解除されたメモリブロックを無制限の長さの空きリストに格納し、空きリストが空のときにfreelist<sizeof(Type), max_unbounded>割り当てられたより大きなチャンクからメモリブロックをサブ割り当てしoperator newます。各チャンクはSz * Nelts、使用可能なメモリのバイトと、必要なデータをoperator new保持しますoperator delete。割り当てられたチャンクが解放されることはありません。
    • cache_chunklist-このテンプレートクラスはoperator new、生のメモリのチャンクを割り当てるために使用し、必要に応じてブロックをサブ割り当てしてメモリブロックにストレージを割り当てます。割り当て解除されたメモリブロックをチャンクごとに個別の空きリストに格納しoperator delete、メモリブロックが使用されていないときにチャンクの割り当てを解除するために使用します。各メモリブロックはSz、使用可能なメモリのバイトと、それが属するチャンクへのポインタを保持します。各チャンクはNelts、メモリブロック、3つのポインタ、int、operator newおよびoperator delete必要なデータを保持します。

私は自分でいくつかのアロケータを書いたが、このドキュメントはただ...紛らわしい。

4

2 に答える 2

7

うわー、彼らは本当にドキュメンテーションを改ざんしましたよね? (私が Dinkumware にいたときにそのコードを書きました)

ここでのアロケーターはポリシーベースです。キャッシュ ポリシーと同期ポリシーを指定できます。

基本的な考え方は、内部キャッシュを使用し、スレッド間で同期できるアロケータを簡単に記述できるようにすることです。半ダースの定義済みアロケータがあります。それらの名前はすべて で始まりますallocator_。必要に応じて使用してください。MSDN の内容で、特定のアロケーターの説明の最初の段落を見てください。彼らが話している「備考」を読まないでくださいALLOCATOR_DECL;。

また、そのコードを使用して、定義済みのキャッシュ戦略 (名前が で始まるテンプレートcache_) と同期戦略 (名前が で始まるテンプレートsync_) を使用する、または独自のキャッシュ テンプレートと同期テンプレートを使用する独自のアロケーターを作成することもできます。これらの部分から使用可能なアロケーターを取得するのは少し面倒なので、ヘッダーをALLOCATOR_DECL使用すると、必要なすべてのボイラープレートを自分で作成しなくても簡単に生成できます。ALLOCATOR_DECL使用するキャッシュ テンプレートの名前、使用する同期テンプレートの名前、作成するアロケーターの名前の 3 つの引数を取ります。だから書く代わりに

template <class T> class name
    : public Dinkum::allocators::allocator_base<T, sync<cache > >
    {
    public:
        name() {}
        template <class U> name(const name<U>&) {}
        template <class U> name& operator = (const name<U>&)
            {return *this; }
        template <class U> struct rebind
            {    /* convert a name<T> to a name<U> */
            typedef name<U> other;
            };
    };

あなたは書くでしょうALLOCATOR_DECL(cache, sync, name);allocator_base重いものを持ち上げます。rebindアロケータ自体は、正しく処理できるように派生型である必要があります。(Dinkumそのコードは Dinkumware のドキュメントから来ています。Microsoft のスタッフがこれらの名前をどの名前空間に入れるかはわかりませんが、おそらくマクロはそこに正しい名前を入れます)。

キャッシュ テンプレートの場合:

  • cache_freelistノードサイズのブロックのリンクリストを維持します。リストの最大サイズはテンプレート パラメータSzで設定され、ノードの割り当ては と で管理されoperator newますoperator delete
  • cache_suballocノードブロックのブロックを管理する別のレイヤーを追加しNelts、すべて単一のブロブとして割り当てます。新しい要素の割り当ては、最初に空きリストを調べ、空きがない場合は新しい BLOB を割り当てます。メモリ ブロックは、アロケータが破棄されるまで削除されません。
  • cache_chunklist( のように) ブロブにメモリを割り当てますがcache_suballoc、共通の空きリストは使用しません。ブロックが解放されると、ブロブの空きリストに戻ります。すべての BLOB ブロックが解放されると、BLOB 自体が削除されます。
于 2012-10-18T15:34:33.060 に答える
0

最初のサブクエスチョンは簡単です。それらをいつ使用するのですか?プロファイリングでデフォルトのアロケーターに問題がある場合。それだけで、この質問はほとんどの開発者にとって無関係になります。

一部のマクロでは動詞「yields」が使用されていますが、これは大まかに「おそらく複数のステップを経て最終的に展開する」という意味です。

キャッシュ テンプレートは、後で再割り当てするために、割り当て解除されたブロックを保存します。割り当てパターンに最適なキャッシュ、再利用率とキャッシュ サイズのトレードオフが最適なキャッシュを選択します (上記のプロファイリングを参照)。

一部のキャッシュ テンプレートには、解放されたブロックの数に制限があり、 によって実装されますfreelist<>。Max クラスは、そのような長さを決定しますfreelist

アロケータは最終的に、上記の構成済みの組み合わせです。

于 2012-10-18T13:09:51.573 に答える