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

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 に向けられる。フリーリスト管理は単純であるため、フリーリストからの割り当ては高速である。 からの割り当ては高速である。adaptiveYes.adaptive に設定されている、 に設定されている場合、アロケーショ ンがリストよりも親のアロケータを使用する傾向がある場合、フリーリストの サイズは徐々に小さくなる。 アロケータがリストの利用可能なノードよりも多く使われる傾向がある場合、空きリストのサイズは徐々に小さくなる。
FreeList!(0, unbounded) 。 その後、(空でなければ)フリーリストから割り当てが行われる。 からの割り当てを提供する。サイズマッチングのチェックはない。 サイズマッチングをチェックすることはない。 フリー・リスト・アロケータの上にあるアロケータ(Segregator など)がすでにサイズ・チェックを担当している場合は、正しく高速に動作する。 のような)空きリストアロケータの上にある所有アロケータがすでにサイズチェックを担当している場合には、正しく高速である。
以下のメソッドは、ParentAllocator で定義されている場合に定義される。 に転送する:expand owns,reallocate.
const @property size_t min();
からの割り当て可能な最小の割り当てサイズを返す。 を返す。(minSize != chooseAtRuntime の場合、これは単に のエイリアスである。 minSize のエイリアスである)。
@property void min(size_t low);
FreeListminSize == chooseAtRuntime でインスタンス化されている場合、この minプロパティは書き込み可能である。これを設定する を設定することは、割り当ての前に行わなければならない。
Parameters:
size_t low の新しい値を設定する。 min

前提条件 low <= maxまたはmaxSize == chooseAtRuntimemax はまだ初期化されていない。また で、まだ初期化されていない。

事後条件 min == low

const @property size_t max();
アロケーションの対象となる最大のアロケーションサイズを を返す。(maxSize != chooseAtRuntime の場合、これは単に maxSize の別名である)。を超える、あるいは min 以下である。 max以下のサイズの割り当て要求はすべて max に丸められ、親アロケータに転送される。同じ制約に適合するブロックが 同じ制約に適合するブロックが割り当て解除されると、そのブロックはフリーリストに入れられる。 でフリーリストに入れられる。 max.
@property void max(size_t high);
FreeListmaxSize == chooseAtRuntime でインスタンス化されている場合、その maxプロパティは書き込み可能である。これを設定する を設定することは、割り当ての前に行わなければならない。
Parameters:
size_t high の新しい値を設定する。 max

前提条件 high >= minまたはminSize == chooseAtRuntimemin はまだ初期化されていない。また、high >= (void*).sizeof 。また、このアロケータではまだ割り当てが行われていない。

ポスト条件 max == high

ParentAllocator parent;
親アロケータ。ParentAllocator 。 を保持しているかどうかによって、これはメンバ変数か ParentAllocator.instance.
alias alignment = ParentAllocator.alignment;
アライメントを提供する。
size_t goodAllocSize(size_t bytes);
maxSize == unbounded の場合は parent.goodAllocSize(bytes). そうでない場合は、区間[min, max] のサイズに対してmax を返す。 parent.goodAllocSize(bytes)を返す。

前提条件 実行時に設定される場合、min および/またはmax は適切に初期化されていなければならない。 適切に初期化されなければならない。

後条件 result >= bytes

void[] allocate(size_t n);
フリー・リストから、あるいは親アロケータからメモリを確保する。 もし 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();
ParentAllocatordeallocateAll.もしそうなら を定義している場合にのみ定義される。
void minimize();
各要素を順番に解放することで、フリーリストのメモリ使用量を最小化する非標準関数である。 各要素を順番に解放することで,freelistのメモリ使用量を最小化する非標準関数である。ParentAllocatordeallocate FreeList!(0, unbounded) にこの関数がない場合のみ定義される。
struct ContiguousFreeList(ParentAllocator, size_t minSize, size_t maxSize = minSize);
フリーリストは、連続した1つのメモリブロックの上に構築される。このブロックは ParentAllocatorで解放される。 ContiguousFreeListのデストラクタで解放される(ParentAllocatorNullAllocator でない限り)。
ContiguousFreeListFreeList の長所をほとんど持っているが、短所は少ない。 デメリットは少ない。アイテムが互いに近いので、キャッシュの局所性が高い。 キャッシュの局所性が高い。親アロケータへのフラグメンテーションが少ない。
の欠点は ContiguousFreeListFreeListFreeList の従量課金制とは対照的である。 リスト内のノード数に制限があることだ。従って、多数の長寿命 このため、多数の長寿命オブジェクトがブロック全体を占有し、空きリストからの割り当てができなくなる可能性がある。 を提供できなくなる。しかし、空きリストのサイズに絶対的な上限を設ける は有益かもしれない。
オプションminSize == unboundedmaxSize == 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(ParentAllocator parent, ubyte[] buffer);

this(size_t bytes);

this(ParentAllocator parent, size_t bytes);

this(size_t bytes, size_t max);

this(ParentAllocator parent, size_t bytes, size_t max);

this(size_t bytes, size_t min, size_t max);

this(ParentAllocator parent, size_t bytes, size_t min, size_t max);
空きリストとして構造化されたメモリをセットアップするコンストラクタ。
Parameters:
ubyte[] buffer フリー・リストとして構造化するバッファ。ParentAllocatorNullAllocator でない場合、バッファは 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_t n);
で初期化される。 nがフリーリスティングの対象であれば、max を返す。そうでない場合は parent.goodAllocSize(n).

前提条件 実行時に設定される場合、min および/またはmax は適切に初期化されなければならない。 を適切に初期化しなければならない。

後条件 result >= bytes

void[] allocate(size_t n);
バイトのメモリーを割り当てる。 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 shared
Examples:
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 void min(size_t newMinSize);

@property size_t max();

@property void max(size_t newMaxSize);

void setBounds(size_t newMin, size_t newMax);
境界を取得(場合によっては設定)するためのプロパティ。境界の設定 を設定することは、割り当てが行われる前に一度だけ許される。そうでない場合は プリミティブはFreeList と同じセマンティクスを持つ。
shared const @property size_t approxMaxLength();

shared @property void approxMaxLength(size_t x);
共有フリーリストのおおよその最大長を取得する(場合によっては設定する)ためのプロパティ。
shared ParentAllocator parent;
親アロケータ。ParentAllocator 。 を保持しているかどうかによって、これはメンバ変数または ParentAllocator.instance.
enum uint alignment;

shared size_t goodAllocSize(size_t bytes);

shared const Ternary owns(const void[] b);

shared bool reallocate(ref void[] b, size_t s);

shared void[] allocate(size_t bytes);

shared bool deallocate(void[] b);

shared bool deallocateAll();
標準プリミティブ。
shared void minimize();
各要素を順番に解放することで、フリーリストのメモリ使用量を最小化する非標準関数。 のメモリ使用量を最小化する非標準関数である。ParentAllocatordeallocate.