英語版
このページの英語版を見る
std.experimental.allocator.building_blocks.allocator_list
- struct
AllocatorList
(Factory, BookkeepingAllocator = GCAllocator);
templateAllocatorList
(alias factoryFunction, BookkeepingAllocator = GCAllocator) - Factory 型のオブジェクトファクトリ、またはファクトリ関数が与えられる。 factoryFunctionオプションでBookkeepingAllocator 。 アロケータを作成する、
AllocatorList
はアロケータを作成する。 アロケータを作成する。組み込まれたリストは、最も最近使われたストラテジーを構築する。 allocate 、owns (成功した呼び出しのみ)、 のいずれかの呼び出しで使用された最新のアロケータが試行される。 (成功したコールのみ)、またはdeallocate へのコールで使用された最も新しいアロケータが、最も最近使用された順に、新しいアロケーションのために試行される。 のいずれかの呼び出しで使用された最も新しいアロケータが、最も最近使用された順に、新しいアロケーションを試みる。したがって、コア操作は、現在使用されているアロケー ターに対して理論的にはΟ(k)の時間を要する。 k を要するが、多くの作業負荷では、その倍率は線形以下である。 実際の戦略の詳細は、将来のリリースで変更される可能性がある。AllocatorList
は、主にアロケータを粗く扱うことを意図している。 つまり、リスト内のアロケータの数は、各アロケータが扱うアロケーションの数に比べて比較的少ないと予想される つまり、リスト内のアロケータの数は、各アロケータが処理するアロケーションの数に比べて比較的少ないと予想される。 によって処理されるアロケーション数に比べて、リスト内のアロケーター数は比較的少ないと予想される。しかし、アロケータごとのオーバヘッドは小さい。AllocatorList
を使用するのは満足できるはずだ。 最も最近使われたストラテジーがアプリケーションにとって十分高速である限り、多数のアロケータを使っても満足できるはずだ。AllocatorList
は、割り当てられたメモリが使われなくなったら戻すように努力する。 を返す努力をする。空のアロケータを破棄するのだ。しかし しかし、スラッシング(特定の使用パターンでアロケータが過剰に生成/破棄されること)を避けるために、未使用のアロケータをしばらく保持する。 を避けるために、未使用のアロケータをしばらく保持する。Parameters:factoryFunction 関数またはテンプレート化された関数(関数リテラルを含む)。 新しいアロケータは、factoryFunction(n) を厳密に正の数で呼び出すことで生成される。 nで呼び出すことで生成される。環境をキャプチャするデリゲートは、環境のガベージ生成に関する懸念があるため、作成されない。 環境のガベージ生成に関する懸念があるためである。ファクトリーが 状態が必要な場合は、Factory オブジェクトを使用する。 BookkeepingAllocator ブックキーピングデータの保存に使用されるアロケータ。ブックキーピングデータのサイズは ブックキーピングデータのサイズはアロケータ数に比例する。BookkeepingAllocator がNullAllocator の場合 AllocatorList
である。 「つまり、アロケータ自身から取得したメモリにブックキーピング・データを保持する。 アロケータ自身から得たメモリに保持する。ウロボロス流の管理では、 に渡されるサイズが異なることがある。 n make 、クライアントコードが要求したサイズと異なることがある。 と異なる場合があることに注意。Factory 必要に応じて新しいアロケータを返すファクトリー・オブジェクトの型。 型である。Factory 型のオブジェクトsweatshop に対して、sweatshop(n) は、次のようなアロケータを返すべきである。 少なくともn バイトを割り当てることができるアロケータを返すべきである(すなわち、Factory は、 型のアロケータを返すように を定義しなければならない)。 アロケータ・オブジェクトを返すようにopCall(size_t) を定義しなければならない)。通常 通常、生成されるアロケータは、n よりもずっと大きくなければならない。 n 。 次の割り当てに必要な最小値を確保するためだけに渡される。ファクトリーオブジェクトは 状態を保持することができる。 AllocatorList
public に格納される。 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
; - BookkeepingAllocator がNullAllocator でない場合、
bkalloc
のエイリアスである。 定義され、アクセス可能である。 - this(ref Factory
plant
);
this(Factoryplant
); - ファクトリー・オブジェクトを指定してAllocatorList を構築する。このコンストラクタは Factory が状態を持つ場合にのみ定義される。
- enum uint
alignment
; - アライメントを提供する。
- void[]
allocate
(size_ts
); - サイズ
s
.最初に既存の のリストから割り当てを試みる。どちらも要求を満たせない場合 を呼び出して新しいアロケータを作成し make(s
)を呼び出して新しいアロケータを作成し、リクエスト をそれに委譲する。しかし、新しく作成されたアロケータからのアロケーションが失敗した場合 が失敗した場合、その後のallocate
を呼び出しても、 make への呼び出しが増えることはない。 - void[]
alignedAllocate
(size_ts
, uinttheAlignment
); - サイズ
s
をアラインメントa で割り当てる。最初に を試みる。どちらも要求を満たせない場合は を呼び出して新しいアロケータを作成する。 make(s
+ a - 1) を呼び出して新しいアロケータを作成し、リクエストをそれに委譲する。しかし が失敗した場合、それ以降のalignedAllocate
を呼び出しても、make を呼び出すことはない。 - Ternary
owns
(void[]b
); - Allocator 。
owns
.を定義している場合のみ定義される。 を順番に試す。オーナーが見つかれば、それは副作用としてリストの先頭に移動される。 に移動される。 すぐに使われる。Returns:Ternary.yes もし1つのアロケータが を返した、 すべてのコンポーネントのアロケータが を返した場合。 を返したアロケータがなく、少なくとも1つの が を返した。Ternary.yes Ternary.no Ternary.no Ternary.unknown Ternary.yes Ternary.unknown - bool
expand
(ref void[]b
, size_tdelta
); - が定義されている場合のみ定義される。 Allocator.
expand
が定義されている場合のみ定義される。の所有者を見つける。b
の所有者を見つけexpand
を呼び出す。所有者はリストの先頭に来ない。 リストの先頭に来ない。 - bool
reallocate
(ref void[]b
, size_ts
); - が定義されている場合にのみ定義される。 Allocator.
reallocate
が定義されている場合のみ定義される。の所有者を見つける。b
の所有者を見つけreallocate
を呼び出す。失敗した場合は、グローバルなreallocate
を呼び出す。 - bool
deallocate
(void[]b
); - が定義されている場合に定義される。 Allocator.
deallocate
とAllocator.owns が定義されている場合に定義される。 - bool
deallocateAll
(); - とAllocator.owns が定義されている場合のみ定義される。 Allocator.
deallocateAll
が定義されている場合にのみ定義される。 が定義されている場合のみ定義される。 - const pure nothrow @nogc @safe Ternary
empty
(); - 現在アクティブなアロケータがない場合はTernary.yes を返す、 Ternary.no を返す。このメソッドは決してTernary.unknown を返さない。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku