Struct std.experimental.allocator.building_blocks.affix_allocator.AffixAllocator
Allocator that adds some extra data before (of type Prefix
) and/or after
(of type Suffix
) any allocation made with its parent allocator. This is
useful for uses where additional allocation-related information is needed, such
as mutexes, reference counts, or walls for debugging memory corruption errors.
struct AffixAllocator(Allocator, Prefix, Suffix)
;
If Prefix
is not void
, Allocator
must guarantee an alignment at
least as large as Prefix
.
Suffixes are slower to get at because of alignment rounding, so prefixes should be preferred. However, small prefixes blunt the alignment so if a large alignment with a small affix is needed, suffixes should be chosen.
The following methods are defined if Allocator
defines them, and forward to it: deallocateAll
, empty
, owns
.
Fields
Name | Type | Description |
---|---|---|
_parent
|
Allocator | If the parent allocator Allocator is stateful, an instance of it is
stored as a member. Otherwise, AffixAllocator uses
Allocator . In either case, the name _parent is uniformly
used for accessing the parent allocator.
|
instance
|
AffixAllocator | The instance singleton is defined if and only if the parent allocator
has no state and defines its own it object.
|
Methods
Name | Description |
---|---|
allocate
()
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
deallocate
(b)
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
deallocateAll
()
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
empty
()
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
expand
(b, delta)
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
goodAllocSize
()
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
owns
()
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
parent
()
|
If the parent allocator Allocator is stateful, an instance of it is
stored as a member. Otherwise, AffixAllocator uses
Allocator . In either case, the name _parent is uniformly
used for accessing the parent allocator.
|
prefix
(b)
|
Affix access functions offering references to the affixes of a
block b previously allocated with this allocator. b may not be null.
They are defined if and only if the corresponding affix is not void .
|
reallocate
(b, s)
|
Standard allocator methods. Each is defined if and only if the parent
allocator defines the homonym method (except for goodAllocSize ,
which may use the global default). Also, the methods will be shared if the parent allocator defines them as such.
|
suffix
(b)
|
Affix access functions offering references to the affixes of a
block b previously allocated with this allocator. b may not be null.
They are defined if and only if the corresponding affix is not void .
|
Example
import std .experimental .allocator .mallocator : Mallocator;
// One word before and after each allocation.
alias A = AffixAllocator!(Mallocator, size_t, size_t);
auto b = A .instance .allocate(11);
A .instance .prefix(b) = 0xCAFE_BABE;
A .instance .suffix(b) = 0xDEAD_BEEF;
assert(A .instance .prefix(b) == 0xCAFE_BABE
&& A .instance .suffix(b) == 0xDEAD_BEEF);