std.experimental.allocator.building_blocks.free_list
- struct
FreeList
(ParentAllocator, size_t minSize, size_t maxSize = minSize, Flag!"adaptive" adaptive = No.adaptive); - フリーリストアロケータ。 アロケータである。min からmax バイトの間のアロケーションリクエストは、 に切り上げられる。 max に切り上げられ、過去に割り当て解除されたバッファの単一リンクリストから提供される。 から提供される。その他の割り当てはすべてParentAllocator に向けられる。フリーリスト管理は単純であるため、フリーリストからの割り当ては高速である。 からの割り当ては高速である。adaptive がYes.adaptive に設定されている、 に設定されている場合、アロケーショ ンがリストよりも親のアロケータを使用する傾向がある場合、フリーリストの サイズは徐々に小さくなる。 アロケータがリストの利用可能なノードよりも多く使われる傾向がある場合、空きリストのサイズは徐々に小さくなる。FreeList!(0, unbounded) 。 その後、(空でなければ)フリーリストから割り当てが行われる。 からの割り当てを提供する。サイズマッチングのチェックはない。 サイズマッチングをチェックすることはない。 フリー・リスト・アロケータの上にあるアロケータ(Segregator など)がすでにサイズ・チェックを担当している場合は、正しく高速に動作する。 のような)空きリストアロケータの上にある所有アロケータがすでにサイズチェックを担当している場合には、正しく高速である。 以下のメソッドは、ParentAllocator で定義されている場合に定義される。 に転送する:expand owns,reallocate.
- const @property size_t
min
(); - からの割り当て可能な最小の割り当てサイズを返す。 を返す。(minSize != chooseAtRuntime の場合、これは単に のエイリアスである。 minSize のエイリアスである)。
- @property void
min
(size_tlow
); - FreeList がminSize == chooseAtRuntime でインスタンス化されている場合、この
min
プロパティは書き込み可能である。これを設定する を設定することは、割り当ての前に行わなければならない。Parameters:size_t low
の新しい値を設定する。 min
前提条件 low <= maxまたはmaxSize == chooseAtRuntime 。 max はまだ初期化されていない。また で、まだ初期化されていない。
事後条件 min == low
- const @property size_t
max
(); - アロケーションの対象となる最大のアロケーションサイズを を返す。(maxSize != chooseAtRuntime の場合、これは単に maxSize の別名である)。を超える、あるいは min 以下である。
max
以下のサイズの割り当て要求はすべて max に丸められ、親アロケータに転送される。同じ制約に適合するブロックが 同じ制約に適合するブロックが割り当て解除されると、そのブロックはフリーリストに入れられる。 でフリーリストに入れられる。max
. - @property void
max
(size_thigh
); - FreeList がmaxSize == chooseAtRuntime でインスタンス化されている場合、その
max
プロパティは書き込み可能である。これを設定する を設定することは、割り当ての前に行わなければならない。Parameters:size_t high
の新しい値を設定する。 max
前提条件 high >= minまたはminSize == chooseAtRuntime 。 min はまだ初期化されていない。また、high >= (void*).sizeof 。また、このアロケータではまだ割り当てが行われていない。
ポスト条件 max == high
- ParentAllocator
parent
; - 親アロケータ。ParentAllocator 。 を保持しているかどうかによって、これはメンバ変数か ParentAllocator.instance.
- alias
alignment
= ParentAllocator.alignment
; - アライメントを提供する。
- size_t
goodAllocSize
(size_tbytes
); - maxSize == unbounded の場合は parent.
goodAllocSize
(bytes
). そうでない場合は、区間[min, max] のサイズに対してmax を返す。 parent.goodAllocSize
(bytes
)を返す。前提条件 実行時に設定される場合、min および/またはmax は適切に初期化されていなければならない。 適切に初期化されなければならない。
後条件 result >= bytes
- void[]
allocate
(size_tn
); - フリー・リストから、あるいは親アロケータからメモリを確保する。 もし
n
が[min, max] 内にあるか、フリーリストのチェックが外されている場合 (minSize == 0 && maxSize == size_t.max) 内にある場合、フリー・リストが最初に参照される。 が最初に参照される。空でなければ(ヒットすれば)、空きリストの先頭にあるブロックがリストから取り除かれ、返される。 の先頭にあるブロックがリストから取り除かれ、返される。そうでなければ(ミス)、 バイトの新しいブロック max バイトに切り詰められ、返される。n
バイトに切り詰められ、返される。Parameters:size_t n
確保するバイト数 Returns:割り当てられたブロック、またはnull 。前提条件 実行時に設定される場合、min および/またはmax は適切に初期化されなければならない。 適切に初期化されなければならない。
後条件 result.length == bytes || result is null
- bool
deallocate
(void[]block
); - もし
block
.lengthが[min, max] 内にあるか、フリー・リストが がチェックされていない場合(minSize == 0 && maxSize == size_t.max )、フリー・リストの先頭にブロックを挿入する。 ブロックをフリーリストの先頭に挿入する。 parent.deallocate それ以外の場合は、もし Parent.deallocate
に転送する。Parameters:void[] block
ブロックを解放する。 前提条件 実行時に設定される場合、min および/またはmax が適切に初期化されていなければならない。 適切に初期化されていなければならない。ブロックはこの ブロックはこのフリーリストで割り当てられていなければならず、min またはmax の動的な変更は許されない。 の動的な変更は許されない。
- bool
deallocateAll
(); - ParentAllocator が
deallocateAll
.もしそうなら を定義している場合にのみ定義される。 - void
minimize
(); - 各要素を順番に解放することで、フリーリストのメモリ使用量を最小化する非標準関数である。 各要素を順番に解放することで,freelistのメモリ使用量を最小化する非標準関数である。ParentAllocator 。 deallocate FreeList!(0, unbounded) にこの関数がない場合のみ定義される。
- struct
ContiguousFreeList
(ParentAllocator, size_t minSize, size_t maxSize = minSize); - フリーリストは、連続した1つのメモリブロックの上に構築される。このブロックは ParentAllocatorで解放される。
ContiguousFreeList
のデストラクタで解放される(ParentAllocator がNullAllocator でない限り)。ContiguousFreeList
はFreeList の長所をほとんど持っているが、短所は少ない。 デメリットは少ない。アイテムが互いに近いので、キャッシュの局所性が高い。 キャッシュの局所性が高い。親アロケータへのフラグメンテーションが少ない。 の欠点はContiguousFreeList
FreeList 。 FreeList の従量課金制とは対照的である。 リスト内のノード数に制限があることだ。従って、多数の長寿命 このため、多数の長寿命オブジェクトがブロック全体を占有し、空きリストからの割り当てができなくなる可能性がある。 を提供できなくなる。しかし、空きリストのサイズに絶対的な上限を設ける は有益かもしれない。 オプションminSize == unbounded とmaxSize == unbounded は で使用できない。ContiguousFreeList
.Examples:import std.experimental.allocator.building_blocks.allocator_list : AllocatorList; import std.experimental.allocator.gc_allocator : GCAllocator; import std.experimental.allocator.common : unbounded; alias ScalableFreeList = AllocatorList!((n) => ContiguousFreeList!(GCAllocator, 0, unbounded)(4096) );
- SParent
parent
; - 親アロケータである。ParentAllocator 。 を保持しているかどうかによって、これはメンバ変数か ParentAllocator.instance.
- enum uint
alignment
; - アライメントを提供する。
- this(ubyte[]
buffer
);
this(ParentAllocatorparent
, ubyte[]buffer
);
this(size_tbytes
);
this(ParentAllocatorparent
, size_tbytes
);
this(size_tbytes
, size_tmax
);
this(ParentAllocatorparent
, size_tbytes
, size_tmax
);
this(size_tbytes
, size_tmin
, size_tmax
);
this(ParentAllocatorparent
, size_tbytes
, size_tmin
, size_tmax
); - 空きリストとして構造化されたメモリをセットアップするコンストラクタ。Parameters:
ubyte[] buffer
フリー・リストとして構造化するバッファ。ParentAllocator が NullAllocator でない場合、バッファは parent
デストラクタで解放される。ParentAllocator parent
親アロケータ。ステートレスアロケータからの構築には instance staticメンバを使用する。 size_t bytes
解放リストに割り当てられるバイト数(アイテムではない)。メモリは 構築時に割り当てられ、デストラクタで割り当て解除される。 size_t max
フリーリストの最大サイズ。この このパラメータを使った構築は、maxSize == chooseAtRuntime またはmaxSize == unbounded の場合のみ定義される。 size_t min
フリーリスティングの対象となる最小サイズ。このパラメータを使用した構築は minSize == chooseAtRuntime の場合のみ定義される。この この条件を満たし、かつ min
パラメータが存在しない、min
で初期化される。 で初期化される。max
. - size_t
goodAllocSize
(size_tn
); - で初期化される。
n
がフリーリスティングの対象であれば、max を返す。そうでない場合は parent.goodAllocSize
(n
).前提条件 実行時に設定される場合、min および/またはmax は適切に初期化されなければならない。 を適切に初期化しなければならない。
後条件 result >= bytes
- void[]
allocate
(size_tn
); - バイトのメモリーを割り当てる。
n
バイトのメモリを確保する。もしn
がフリーリストの対象で freelistが空でなければ、メモリを空きリストから取り出す。それ以外の場合は 親アロケータを使う。 - Ternary
owns
(void[]b
); - ParentAllocator 。ブロックが ブロックがこのアロケータに属しているかチェックする。
- bool
deallocate
(void[]b
); - デアロケートする
b
.適格なサイズであればフリーリストに置かれる。 そうでなければ、parent に戻される。前提条件
b
がこのアロケータで割り当て済みであるか、 null 。 - bool
deallocateAll
(); - 親からすべてをデアロケートする。
- Ternary
empty
(); - このアロケータで現在メモリが割り当てられていなければTernary.yes を返し、そうでなければ を返す。 そうでなければTernary.no を返す。このメソッドは Ternary.unknown.
- struct
SharedFreeList
(ParentAllocator, size_t minSize, size_t maxSize = minSize, size_t approxMaxNodes = unbounded); - FreeListはスレッド間で共有される。割り当てと解放はロックフリーである。パラメータは パラメータはFreeList と同じセマンティクスを持つ。expand への転送が定義されている。 ( )でなければならない。ParentAllocator.expand sharedExamples:
import std.experimental.allocator.common : chooseAtRuntime; import std.experimental.allocator.mallocator : Mallocator; shared SharedFreeList!(Mallocator, chooseAtRuntime, chooseAtRuntime) a; a.setBounds(64, 128); writeln(a.max); // 128 writeln(a.min); // 64
Examples:import std.experimental.allocator.common : chooseAtRuntime; import std.experimental.allocator.mallocator : Mallocator; shared SharedFreeList!(Mallocator, 50, 50, chooseAtRuntime) a; // Set the maxSize first so setting the minSize doesn't throw a.approxMaxLength = 128; writeln(a.approxMaxLength); // 128 a.approxMaxLength = 1024; writeln(a.approxMaxLength); // 1024 a.approxMaxLength = 1; writeln(a.approxMaxLength); // 1
- @property size_t
min
();
@property voidmin
(size_tnewMinSize
);
@property size_tmax
();
@property voidmax
(size_tnewMaxSize
);
voidsetBounds
(size_tnewMin
, size_tnewMax
); - 境界を取得(場合によっては設定)するためのプロパティ。境界の設定 を設定することは、割り当てが行われる前に一度だけ許される。そうでない場合は プリミティブはFreeList と同じセマンティクスを持つ。
- shared const @property size_t
approxMaxLength
();
shared @property voidapproxMaxLength
(size_tx
); - 共有フリーリストのおおよその最大長を取得する(場合によっては設定する)ためのプロパティ。
- shared ParentAllocator
parent
; - 親アロケータ。ParentAllocator 。 を保持しているかどうかによって、これはメンバ変数または ParentAllocator.instance.
- enum uint
alignment
;
shared size_tgoodAllocSize
(size_tbytes
);
shared const Ternaryowns
(const void[]b
);
shared boolreallocate
(ref void[]b
, size_ts
);
shared void[]allocate
(size_tbytes
);
shared booldeallocate
(void[]b
);
shared booldeallocateAll
(); - 標準プリミティブ。
- shared void
minimize
(); - 各要素を順番に解放することで、フリーリストのメモリ使用量を最小化する非標準関数。 のメモリ使用量を最小化する非標準関数である。ParentAllocator で deallocate.
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku