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

std.experimental.allocator.building_blocks.bucketizer

struct Bucketizer(Allocator, size_t min, size_t max, size_t step);
A Bucketizerのサイズの割り当てを処理するために個別のアロケータを使用する。 [min, min + step - 1],[min + step, min + 2 * step - 1][min + 2 * step, min + 3 * step - 1] ...,[max - step + 1, max].
Bucketizerは、固定サイズのアロケータ配列を保持し、適切に呼び出しをディスパッチする。 を適切にディスパッチする。配列のサイズは(max + 1 - min) / step である。 であり、正確な除算でなければならない。
min より小さいサイズ、またはmax より大きいサイズの割り当ては不正である。 である。 Bucketizer.これらを個別に処理するには、Segregator が役に立つかもしれない。
Examples:
import std.algorithm.comparison : max;
import std.experimental.allocator.building_blocks.allocator_list : AllocatorList;
import std.experimental.allocator.building_blocks.free_list : FreeList;
import std.experimental.allocator.building_blocks.region : Region;
import std.experimental.allocator.common : unbounded;
import std.experimental.allocator.mallocator : Mallocator;
import std.typecons : Ternary;
Bucketizer!(
    FreeList!(
        AllocatorList!(
            (size_t n) => Region!Mallocator(max(n, 1024 * 1024))),
        0, unbounded),
    65, 512, 64) a;
auto b = a.allocate(400);
writeln(b.length); // 400
writeln(a.owns(b)); // Ternary.yes
a.deallocate(b);
Allocator[(max + 1 - min) / step] buckets;
アロケーターの配列は、初期化や検査などのために公開されている。 検査などに利用できる。
enum uint alignment;
提供されるアラインメントは Allocator.alignment.
const pure nothrow @nogc @safe size_t goodAllocSize(size_t bytes);
と同じである。 bytesである。
void[] allocate(size_t bytes);
buckets 、いずれかのアロケータに呼び出しを向ける。
void[] alignedAllocate(size_t bytes, uint alignment);
要求された bytes指定された alignment. 呼び出しをbuckets アロケータのいずれかに向ける。以下の場合のみ定義される。 Allocator が定義されている場合のみ定義される。 alignedAllocate.
bool expand(ref void[] b, size_t delta);
このメソッドは、それぞれのバケット範囲内での拡張を許可する。このメソッドは と b.lengthb.length + delta の両方が [min + k * step, min + (k + 1) * step - 1].
bool reallocate(ref void[] b, size_t size);
このメソッドは、それぞれのバケツ範囲内での再配置を許す。もし b.lengthsize[min + k * step, min + (k + 1) * step - 1] の範囲にある場合、再配置が行われる。そうでなければ を含む再配置が試行される。
bool alignedReallocate(ref void[] b, size_t size, uint a);
reallocate に似ているが、アライメントがある。以下の場合にのみ定義される。Allocator を定義する。 alignedReallocate.
Ternary owns(void[] b);
Allocator で定義されている場合にのみ定義される。 owns.のオーナーを見つけ、そのオーナーに呼び出しを転送する。 bのオーナーを見つけ、そのオーナーに呼び出しを転送する。
bool deallocate(void[] b);
このメソッドは、Allocatordeallocate.
bool deallocateAll();
このメソッドは、関係するすべてのアロケータが deallocateAll を定義している場合にのみ定義され、各バケツに対して順番に呼び出される。true すべての を返す。
Ternary resolveInternalPointer(const void* p, ref void[] result);
このメソッドは、関係するすべてのロケータが resolveInternalPointer を定義し、各バケツに対して順番に試行する場合にのみ定義される。