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

std.experimental.allocator.typed

このモジュールはTypedAllocator を定義する。 を定義する。 アロケータを定義する。例えば、スレッドローカル型とスレッドシェア型では別々のアロケータを使うことができる。 例えば、スレッドローカルデータとスレッド共有データ、固定サイズデータ (structclass オブジェクト)対サイズ変更可能なデータ(配列)である。
enum AllocFlag: uint;
型の特性によって決まる割り当て関連のフラグ。TypedAllocator は、割り当てられる型からこれらのフラグを推測し、それに応じて適切なアロケータを使用する。 を使用する。
fixedSize
固定サイズの割り当て(後で再割り当てされる可能性が低い)。例:":int, double struct またはclass 型。デフォルトでは つまり、後で再割り当てされる可能性がある。 (例: すべての配列型)。このフラグは推奨である。 に対してサイズ変更が試みられ、成功する可能性がある。 fixedSize割り当てに対してインプレース・リサイズが試みられ、成功する可能性がある。このフラグは このフラグは、コンパイラが固定サイズのオブジェクトでうまく機能するようなアロケーション戦略を使用するためのヒントである。 このフラグは、固定サイズのオブジェクトでうまく機能する割り当て戦略を使うことができることをコンパイラに示すヒントに過ぎない。
hasNoIndirections
割り当てられる型はポインタを持たない。例:" , , :int int[], Tuple!(int, float).暗黙の保守的な仮定は、"型"が間接参照を持つメンバを持つということである。 型は間接参照を持つメンバを持つので、ガベージコレクションされる場合はスキャンされる必要がある。 収集される。ポインターを持つ型の例: , :int*[] Tuple!(int, string)
immutableShared

threadLocal
デフォルトでは、割り当てられたメモリは保守的にcast デフォルトでは、割り当てられたメモリはshared 、スレッド間で受け渡しされ、割り当てたスレッドとは異なるスレッドで割り当て解除される可能性があると保守的に想定されている。 デフォルトでは、割り当てられたメモリは、スレッドをまたがって渡され、割り当てたスレッドとは別のスレッドで割り当て解除される可能性があると保守的に想定されている。そうでない場合は、2つの選択肢がある。 つのオプションがある。1つ目は immutableSharedは、メモリが immutable メモリはデータ用に割り当てられ、割り当てられたスレッドと同じスレッドで解放される。 で解放される。第二に threadLocalメモリはスレッド間で共有されない スレッド間で共有されないことを意味する。この2つのフラグを同時に指定することはできない。
struct TypedAllocator(PrimaryAllocator, Policies...);
TypedAllocatorは、いくつかの特殊なアロケータを組み立てるための筐体のようなものだ。 を組み立てることができる。システムに特定の種類の割り当てを選択させるには、それぞれのパラメーターに。 を選択させるには、それぞれのパラメータにDefault を使う。
アロケーションの種類には階層がある。アロケータが あるフラグの組み合わせに対してアロケータが実装されている場合、それが使用される。そうでない場合は、リストの次のものが選ばれる。 が選ばれる。
AllocFlag 組み合わせ 説明
AllocFlag.threadLocal`|AllocFlag.hasNoIndirections`|AllocFlag.fixedSize`を組み合わせる。 | AllocFlag.fixedSize`である。 これは最も特殊な割り当てポリシーである。 スレッドローカルで、間接参照は全くなく、再割り当てされない。割り当てられるメモリはスレッドローカルであり、間接参照は一切なく、再割り当てはされない。 この説明に当てはまる型の例:int doubleTuple!(int, long) 、ただし ただし、Tuple!(int, string) 、これはインダイレクトを含む。
AllocFlag.threadLocal|AllocFlag.hasNoIndirections`」と記述する。 上記と同様だが、後で再割り当てされる可能性がある。この説明に適合する型の例: 、 、 、 、 、 、 、 、 、 、 、 、 。 int[]double[]Tuple!(int, long)[] 、は該当しない。 Tuple!(int, string)[]これはインダイレクトを含む。
AllocFlag.threadLocal`(アロックフラグ・スレッドローカル 上記と同様だが、インダイレクトを埋め込むことができる。この説明に適合する型の例: は以下の通りである。 int*[],Object[],Tuple!(int, string)[] などである。
AllocFlag.immutableShared|AllocFlag.hasNoIndirections|AllocFlag.fixedIndirectionsがある。 | AllocFlag.fixedSize` である。 割り当てられている型はimmutable 、ポインタを持たない。を持つ。 を割り当てたスレッドは、それをデアロケートしなければならない。例:immutable(int)
AllocFlag.immutableShared|AllocFlag.hasNoIndirections`。 上記と同様だが、型は将来追加される可能性がある。例:string.
AllocFlag.immutableShared`の場合。 上記と同様だが、型に参照を埋め込むことができる。例:immutable(Object)[].
AllocFlag.hasNoIndirections|AllocFlag.fixedSize`を指定する。 割り当てられる型はスレッド間で共有される可能性があり、間接参照を含まない、 固定サイズである。
AllocFlag.hasNoIndirections`を指定する。 割り当てられる型はスレッド間で共有され、間接参照を埋め込むことができる、 サイズが可変である。
`AllocFlag.fixedSize` を指定する。 割り当てられる型はスレッド間で共有され、間接参照を埋め込むことができる、 固定サイズである。
`0` 最も保守的/一般的な割り当て:メモリを共有することができる、 メモリは共有される可能性があり、別のスレッドで割り当て解除される可能性がある。 参照を埋め込むことができる。
Parameters:
PrimaryAllocator デフォルトのアロケータ。
Policies AllocFlag とアロケータ型からなる0個以上のペア。 型である。
Examples:
import std.experimental.allocator.gc_allocator : GCAllocator;
import std.experimental.allocator.mallocator : Mallocator;
import std.experimental.allocator.mmap_allocator : MmapAllocator;
alias MyAllocator = TypedAllocator!(GCAllocator,
    AllocFlag.fixedSize | AllocFlag.threadLocal, Mallocator,
    AllocFlag.fixedSize | AllocFlag.threadLocal
            | AllocFlag.hasNoIndirections,
        MmapAllocator,
);

MyAllocator a;
auto b = &a.allocatorFor!0();
static assert(is(typeof(*b) == shared const(GCAllocator)));
enum f1 = AllocFlag.fixedSize | AllocFlag.threadLocal;
auto c = &a.allocatorFor!f1();
static assert(is(typeof(*c) == Mallocator));
enum f2 = AllocFlag.fixedSize | AllocFlag.threadLocal;
static assert(is(typeof(a.allocatorFor!f2()) == Mallocator));
// Partial match
enum f3 = AllocFlag.threadLocal;
static assert(is(typeof(a.allocatorFor!f3()) == Mallocator));

int* p = a.make!int;
scope(exit) a.dispose(p);
int[] arr = a.makeArray!int(42);
scope(exit) a.dispose(arr);
assert(a.expandArray(arr, 3));
assert(a.shrinkArray(arr, 4));
ref auto allocatorFor(uint flags)();

ref auto allocatorFor(T)();
flagsAllocFlag の値の組み合わせ、またはT の型が与えられると、能力に最も近いアロケータを返す。 アロケータを返す。
uint type2flags(T)();
T 、そのアロケーション関連フラグを値の組み合わせとして返す。 AllocFlag 値を返す。
auto make(T, A...)(auto ref A args);
で選択された適切なアロケータを使用して)動的にアロケートし、アロケートされたメモリに作成する。 allocatorFor!T で選択された適切なアロケータを使用して)動的にアロケートし、アロケートされたメモリに以下のオブジェクトを生成する。 T 型のオブジェクトを生成する。 args(もしあれば)を使って初期化する。初期化 は確保されたメモリ内で行われ、それ以外は意味的に T(args).(と同じである。 make!(T[])を使うと、配列ではなく Tの(空の)配列へのポインタを作成する。配列を割り当てて初期化するには 配列を割り当てて初期化するには、後述のmakeArray!T )。
Parameters:
T 作成されるオブジェクトの型。
A args 作成されたオブジェクトの初期化に使用されるオプションの引数。もし 存在しない場合、オブジェクトはデフォルトで構築される。
Returns:
T がクラス型の場合、作成されたオブジェクトへの参照を返す。T オブジェクトへの参照を返す。そうでない場合は、作成されたオブジェクトを指すT* を返す。すべての場合において 割り当てに失敗した場合は、null を返す。
Throws:
T のコンストラクタがスローした場合、割り当てられたメモリを解放し、例外を伝播する。 例外を伝播する。
T[] makeArray(T)(size_t length);

T[] makeArray(T)(size_t length, auto ref T init);

T[] makeArray(T, R)(R range)
if (isInputRange!R);
要素を持つT の配列を作成する。 length要素の配列を作成する。この配列は のコピーで満たされる。 initまたは から取得した値で初期化される。 range.
Parameters:
T 作成される配列の要素型
size_t length 新しく作成される配列の長さ
T init 配列を埋めるために使われる要素
R range 配列要素の初期化に使用する範囲
Returns:
null 新しく作成された配列。 length0 、あるいは 割り当てに失敗した。
Throws:
最初の2つのオーバーロードは、使用されているアロケータプリミティブがそうである場合にのみスローする。 コピーの初期化を含むオーバーロードは、メモリーの割り当てを解除し、コピー操作がスローした場合に例外を伝播する。
bool expandArray(T)(ref T[] array, size_t delta);

bool expandArray(T)(T[] array, size_t delta, auto ref T init);

bool expandArray(T, R)(ref T[] array, R range)
if (isInputRange!R);
成長する array要素を追加することで delta要素を追加することで成長する。必要なメモリは 配列型に使われたのと同じアロケータを使って確保される。追加された のコピーで満たされる。 initから取得した値で初期化される。 range.
Parameters:
T 作成される配列の要素型
T[] array 作成される配列への参照
size_t delta 追加する要素数(成功した場合は、新しい長さの arrayarray.length + delta)
T init 配列を埋める要素。
R range 配列要素の初期化に使用する範囲
Returns:
true 成功した場合は、 。後者の場合 後者の場合false arrayは影響を受けない。
Throws:
最初の2つのオーバーロードは、使用されるアロケータプリミティブがそうである場合にのみスローする。 コピーの初期化を含むオーバーロードは、メモリーの割り当てを解除し、コピー操作がスローした場合に例外を伝播する。 コピー操作がスローした場合に例外を伝播する。
bool shrinkArray(T)(ref T[] arr, size_t delta);
deltaallocatorFor!(T[])要素を用いて配列を縮小する。
arr.length < delta の場合は何もせず,false を返す。そうでなければ 配列の最後のarr.length - delta 要素を破棄する。 配列のバッファを再割り当てする。再割り当てに失敗した場合は、デフォルトで初期化されたデータで配列を埋める。 で埋める。
Parameters:
T 作成される配列の要素型。
T[] arr 縮小される配列への参照。
size_t delta 削除する要素数(成功した場合は、新しい長さの arrの新しい長さはarr.length - delta)
Returns:
true 成功時、メモリを再割り当てできなかった場合は となる。後者の場合 後者の場合、 、デフォルトで初期化された 要素が残る。 false arr[$ - delta .. $]
Throws:
最初の2つのオーバーロードは、使用されるアロケータプリミティブがそうである場合にのみスローする。 コピーの初期化を含むオーバーロードは、メモリーの割り当てを解除し、コピー操作がスローした場合に例外を伝播する。 コピー操作がスローした場合に例外を伝播する。
void dispose(T)(T* p);

void dispose(T)(T p)
if (is(T == class) || is(T == interface));

void dispose(T)(T[] array);
ポインタが指すオブジェクトを破棄し、(allocatorFor!T を使って)デアロケートする。 ポインタによって指されたオブジェクト、class または参照によって参照されたクラス・オブジェクト、または配列全体を破棄し、その後、破棄する( を使用する)。interface 参照によって参照されるクラス・オブジェクト、または配列全体を破壊し、その後、解放する( を使用)。それぞれの実体は同じアロケーショ ンで割り当てられたものとする。 同じアロケータで割り当てられたものとする。