英語版
このページの英語版を見る
std.experimental.allocator.typed
このモジュールはTypedAllocator を定義する。
を定義する。
アロケータを定義する。例えば、スレッドローカル型とスレッドシェア型では別々のアロケータを使うことができる。
例えば、スレッドローカルデータとスレッド共有データ、固定サイズデータ (struct 、
class オブジェクト)対サイズ変更可能なデータ(配列)である。
- 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 double 、Tuple!(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 autoallocatorFor
(T)(); - flags 、AllocFlag の値の組み合わせ、またはT の型が与えられると、能力に最も近いアロケータを返す。 アロケータを返す。
- uint
type2flags
(T)(); - T 、そのアロケーション関連フラグを値の組み合わせとして返す。 AllocFlag 値を返す。
- auto
make
(T, A...)(auto ref Aargs
); - で選択された適切なアロケータを使用して)動的にアロケートし、アロケートされたメモリに作成する。 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_tlength
);
T[]makeArray
(T)(size_tlength
, auto ref Tinit
);
T[]makeArray
(T, R)(Rrange
)
if (isInputRange!R); - 要素を持つT の配列を作成する。
length
要素の配列を作成する。この配列は のコピーで満たされる。init
または から取得した値で初期化される。range
.Parameters:T 作成される配列の要素型 size_t length
新しく作成される配列の長さ T init
配列を埋めるために使われる要素 R range
配列要素の初期化に使用する範囲 Returns:null 新しく作成された配列。length
が0 、あるいは 割り当てに失敗した。Throws:最初の2つのオーバーロードは、使用されているアロケータプリミティブがそうである場合にのみスローする。 コピーの初期化を含むオーバーロードは、メモリーの割り当てを解除し、コピー操作がスローした場合に例外を伝播する。 - bool
expandArray
(T)(ref T[]array
, size_tdelta
);
boolexpandArray
(T)(T[]array
, size_tdelta
, auto ref Tinit
);
boolexpandArray
(T, R)(ref T[]array
, Rrange
)
if (isInputRange!R); - 成長する
array
要素を追加することでdelta
要素を追加することで成長する。必要なメモリは 配列型に使われたのと同じアロケータを使って確保される。追加された のコピーで満たされる。init
から取得した値で初期化される。range
.Parameters:T 作成される配列の要素型 T[] array
作成される配列への参照 size_t delta
追加する要素数(成功した場合は、新しい長さの array
はarray.length + delta)T init
配列を埋める要素。 R range
配列要素の初期化に使用する範囲 Returns:true 成功した場合は、 。後者の場合 後者の場合falsearray
は影響を受けない。Throws:最初の2つのオーバーロードは、使用されるアロケータプリミティブがそうである場合にのみスローする。 コピーの初期化を含むオーバーロードは、メモリーの割り当てを解除し、コピー操作がスローした場合に例外を伝播する。 コピー操作がスローした場合に例外を伝播する。 - bool
shrinkArray
(T)(ref T[]arr
, size_tdelta
); - 。
delta
allocatorFor!(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
);
voiddispose
(T)(Tp
)
if (is(T == class) || is(T == interface));
voiddispose
(T)(T[]array
); - ポインタが指すオブジェクトを破棄し、(allocatorFor!T を使って)デアロケートする。 ポインタによって指されたオブジェクト、class または参照によって参照されたクラス・オブジェクト、または配列全体を破棄し、その後、破棄する( を使用する)。interface 参照によって参照されるクラス・オブジェクト、または配列全体を破壊し、その後、解放する( を使用)。それぞれの実体は同じアロケーショ ンで割り当てられたものとする。 同じアロケータで割り当てられたものとする。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku