英語版
このページの英語版を見る

std.experimental.allocator.building_blocks.allocator_list

struct AllocatorList(Factory, BookkeepingAllocator = GCAllocator);

template AllocatorList(alias factoryFunction, BookkeepingAllocator = GCAllocator)
Factory 型のオブジェクトファクトリ、またはファクトリ関数が与えられる。 factoryFunctionオプションでBookkeepingAllocator 。 アロケータを作成する、 AllocatorListはアロケータを作成する。 アロケータを作成する。
組み込まれたリストは、最も最近使われたストラテジーを構築する。 allocateowns (成功した呼び出しのみ)、 のいずれかの呼び出しで使用された最新のアロケータが試行される。 (成功したコールのみ)、またはdeallocate へのコールで使用された最も新しいアロケータが、最も最近使用された順に、新しいアロケーションのために試行される。 のいずれかの呼び出しで使用された最も新しいアロケータが、最も最近使用された順に、新しいアロケーションを試みる。したがって、コア操作は、現在使用されているアロケー ターに対して理論的にはΟ(k)の時間を要する。 k を要するが、多くの作業負荷では、その倍率は線形以下である。 実際の戦略の詳細は、将来のリリースで変更される可能性がある。
AllocatorListは、主にアロケータを粗く扱うことを意図している。 つまり、リスト内のアロケータの数は、各アロケータが扱うアロケーションの数に比べて比較的少ないと予想される つまり、リスト内のアロケータの数は、各アロケータが処理するアロケーションの数に比べて比較的少ないと予想される。 によって処理されるアロケーション数に比べて、リスト内のアロケーター数は比較的少ないと予想される。しかし、アロケータごとのオーバヘッドは小さい。 AllocatorListを使用するのは満足できるはずだ。 最も最近使われたストラテジーがアプリケーションにとって十分高速である限り、多数のアロケータを使っても満足できるはずだ。
AllocatorListは、割り当てられたメモリが使われなくなったら戻すように努力する。 を返す努力をする。空のアロケータを破棄するのだ。しかし しかし、スラッシング(特定の使用パターンでアロケータが過剰に生成/破棄されること)を避けるために、未使用のアロケータをしばらく保持する。 を避けるために、未使用のアロケータをしばらく保持する。
Parameters:
factoryFunction 関数またはテンプレート化された関数(関数リテラルを含む)。 新しいアロケータは、factoryFunction(n) を厳密に正の数で呼び出すことで生成される。 nで呼び出すことで生成される。環境をキャプチャするデリゲートは、環境のガベージ生成に関する懸念があるため、作成されない。 環境のガベージ生成に関する懸念があるためである。ファクトリーが 状態が必要な場合は、Factory オブジェクトを使用する。
BookkeepingAllocator ブックキーピングデータの保存に使用されるアロケータ。ブックキーピングデータのサイズは ブックキーピングデータのサイズはアロケータ数に比例する。BookkeepingAllocatorNullAllocator の場合 AllocatorListである。 「つまり、アロケータ自身から取得したメモリにブックキーピング・データを保持する。 アロケータ自身から得たメモリに保持する。ウロボロス流の管理では、 に渡されるサイズが異なることがある。 n make 、クライアントコードが要求したサイズと異なることがある。 と異なる場合があることに注意。
Factory 必要に応じて新しいアロケータを返すファクトリー・オブジェクトの型。 型である。Factory 型のオブジェクトsweatshop に対して、sweatshop(n) は、次のようなアロケータを返すべきである。 少なくともn バイトを割り当てることができるアロケータを返すべきである(すなわち、Factory は、 型のアロケータを返すように を定義しなければならない)。 アロケータ・オブジェクトを返すようにopCall(size_t) を定義しなければならない)。通常 通常、生成されるアロケータは、n よりもずっと大きくなければならない。 n 。 次の割り当てに必要な最小値を確保するためだけに渡される。ファクトリーオブジェクトは 状態を保持することができる。 AllocatorListpublic に格納される。 factoryと呼ばれる。
Examples:
import std.algorithm.comparison : max;
import std.experimental.allocator.building_blocks.free_list : ContiguousFreeList;
import std.experimental.allocator.building_blocks.null_allocator : NullAllocator;
import std.experimental.allocator.building_blocks.region : Region;
import std.experimental.allocator.building_blocks.segregator : Segregator;
import std.experimental.allocator.gc_allocator : GCAllocator;
import std.experimental.allocator.mmap_allocator : MmapAllocator;

// Ouroboros allocator list based upon 4MB regions, fetched directly from
// mmap. All memory is released upon destruction.
alias A1 = AllocatorList!((n) => Region!MmapAllocator(max(n, 1024 * 4096)),
    NullAllocator);

// Allocator list based upon 4MB regions, fetched from the garbage
// collector. All memory is released upon destruction.
alias A2 = AllocatorList!((n) => Region!GCAllocator(max(n, 1024 * 4096)));

// Ouroboros allocator list based upon 4MB regions, fetched from the garbage
// collector. Memory is left to the collector.
alias A3 = AllocatorList!(
    (n) => Region!NullAllocator(new ubyte[max(n, 1024 * 4096)]),
    NullAllocator);

// Allocator list that creates one freelist for all objects
alias A4 =
    Segregator!(
        64, AllocatorList!(
            (n) => ContiguousFreeList!(NullAllocator, 0, 64)(
                cast(ubyte[])(GCAllocator.instance.allocate(4096)))),
        GCAllocator);

A4 a;
auto small = a.allocate(64);
assert(small);
a.deallocate(small);
auto b1 = a.allocate(1024 * 8192);
assert(b1 !is null); // still works due to overdimensioning
b1 = a.allocate(1024 * 10);
writeln(b1.length); // 1024 * 10
alias Allocator = typeof(Factory.init(1));
typeof(Factory()(1)) の別名、すなわち個々のアロケータの型。 の別名である。
BookkeepingAllocator bkalloc;
BookkeepingAllocatorNullAllocator でない場合、 bkallocのエイリアスである。 定義され、アクセス可能である。
this(ref Factory plant);

this(Factory plant);
ファクトリー・オブジェクトを指定してAllocatorList を構築する。このコンストラクタは Factory が状態を持つ場合にのみ定義される。
enum uint alignment;
アライメントを提供する。
void[] allocate(size_t s);
サイズ s.最初に既存の のリストから割り当てを試みる。どちらも要求を満たせない場合 を呼び出して新しいアロケータを作成し make(s)を呼び出して新しいアロケータを作成し、リクエスト をそれに委譲する。しかし、新しく作成されたアロケータからのアロケーションが失敗した場合 が失敗した場合、その後の allocateを呼び出しても、 make への呼び出しが増えることはない。
void[] alignedAllocate(size_t s, uint theAlignment);
サイズ sをアラインメントa で割り当てる。最初に を試みる。どちらも要求を満たせない場合は を呼び出して新しいアロケータを作成する。 make(s + a - 1) を呼び出して新しいアロケータを作成し、リクエストをそれに委譲する。しかし が失敗した場合、それ以降の alignedAllocate を呼び出しても、make を呼び出すことはない。
Ternary owns(void[] b);
Allocatorowns.を定義している場合のみ定義される。 を順番に試す。オーナーが見つかれば、それは副作用としてリストの先頭に移動される。 に移動される。 すぐに使われる。
Returns:
Ternary.yes もし1つのアロケータが を返した、 すべてのコンポーネントのアロケータが を返した場合。 を返したアロケータがなく、少なくとも1つの が を返した。Ternary.yes Ternary.no Ternary.no Ternary.unknown Ternary.yes Ternary.unknown
bool expand(ref void[] b, size_t delta);
が定義されている場合のみ定義される。 Allocator.expandが定義されている場合のみ定義される。の所有者を見つける。 b の所有者を見つけ expandを呼び出す。所有者はリストの先頭に来ない。 リストの先頭に来ない。
bool reallocate(ref void[] b, size_t s);
が定義されている場合にのみ定義される。 Allocator.reallocateが定義されている場合のみ定義される。の所有者を見つける。 bの所有者を見つけ reallocateを呼び出す。失敗した場合は、グローバルな reallocateを呼び出す。
bool deallocate(void[] b);
が定義されている場合に定義される。 Allocator.deallocateAllocator.owns が定義されている場合に定義される。
bool deallocateAll();
Allocator.owns が定義されている場合のみ定義される。 Allocator.deallocateAllが定義されている場合にのみ定義される。 が定義されている場合のみ定義される。
const pure nothrow @nogc @safe Ternary empty();
現在アクティブなアロケータがない場合はTernary.yes を返す、 Ternary.no を返す。このメソッドは決してTernary.unknown を返さない。