template<typename BlockType = FirstFitBlock<uintptr_t>>
class pw::allocator::FirstFitAllocator< BlockType >
Block allocator that uses a "first-fit" allocation strategy split between large and small allocations.
In this strategy, the allocator handles an allocation request by starting at the beginning of the range of blocks and looking for the first one which can satisfy the request.
Optionally, callers may set a "threshold" value. If set, requests smaller than the threshold are satisfied using the last compatible block. This separates large and small requests and can reduce overall fragmentation.
|
|
constexpr | FirstFitAllocator ()=default |
| | Constexpr constructor. Callers must explicitly call Init.
|
| |
| | FirstFitAllocator (ByteSpan region) |
| |
| | FirstFitAllocator (ByteSpan region, size_t threshold) |
| |
|
void | set_threshold (size_t threshold) |
| | Sets the threshold value for which requests are considered "large".
|
| |
|
Range | blocks () const |
| | Returns a Range of blocks tracking the memory of this allocator.
|
| |
| void | Init (ByteSpan region) |
| |
| size_t | GetMaxAllocatable () |
| |
|
| GenericBlockAllocator (const GenericBlockAllocator &)=delete |
| |
|
GenericBlockAllocator & | operator= (const GenericBlockAllocator &)=delete |
| |
|
| GenericBlockAllocator (GenericBlockAllocator &&)=delete |
| |
|
GenericBlockAllocator & | operator= (GenericBlockAllocator &&)=delete |
| |
| void * | Allocate (Layout layout) |
| |
| template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args> |
| T * | New (Args &&... args) |
| |
| template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
| ElementType * | New () |
| |
| template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| ElementType * | New (size_t count) |
| |
| template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| ElementType * | New (size_t count, size_t alignment) |
| | Constructs an alignment-byte aligned array of count objects.
|
| |
| template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args> |
| UniquePtr< T > | MakeUnique (Args &&... args) |
| |
| template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| UniquePtr< T > | MakeUnique (size_t size) |
| |
| template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| UniquePtr< T > | MakeUnique (size_t size, size_t alignment) |
| |
| template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
| UniquePtr< T > | MakeUnique () |
| |
| template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0, typename... Args> |
| SharedPtr< T > | MakeShared (Args &&... args) |
| |
| template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| SharedPtr< T > | MakeShared (size_t size) |
| |
| template<typename T , std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| SharedPtr< T > | MakeShared (size_t size, size_t alignment) |
| |
| template<typename T , std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
| SharedPtr< T > | MakeShared () |
| |
| bool | Resize (void *ptr, size_t new_size) |
| |
| void * | Reallocate (void *ptr, Layout new_layout) |
| |
| size_t | GetAllocated () const |
| |
|
std::optional< Fragmentation > | MeasureFragmentation () const |
| | Returns fragmentation information for the allocator's memory region.
|
| |
|
constexpr const Capabilities & | capabilities () const |
| |
|
constexpr bool | HasCapability (Capability capability) const |
| | Returns whether a given capability is enabled for this object.
|
| |
| void | Deallocate (void *ptr) |
| |
| template<typename ElementType > |
| void | DeleteArray (ElementType *ptr, size_t count) |
| |
| StatusWithSize | GetCapacity () const |
| |
| bool | IsEqual (const Deallocator &other) const |
| |
| template<typename T , int &... kExplicitGuard, std::enable_if_t<!std::is_array_v< T >, int > = 0> |
| void | Delete (T *ptr) |
| |
|
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_bounded_array_v< T >, int > = 0> |
| void | Delete (ElementType *ptr) |
| |
|
template<typename T , int &... kExplicitGuard, typename ElementType = std::remove_extent_t<T>, std::enable_if_t< is_unbounded_array_v< T >, int > = 0> |
| void | Delete (ElementType *ptr, size_t count) |
| |
|
| static constexpr Capabilities | kCapabilities |
| |
|
static constexpr size_t | kPoisonInterval = PW_ALLOCATOR_BLOCK_POISON_INTERVAL |
| |
| void * | DoAllocate (Layout layout) override |
| |
| void | DoDeallocate (void *ptr) override |
| |
| bool | DoResize (void *ptr, size_t new_size) override |
| |
| size_t | DoGetAllocated () const override |
| |
| std::optional< Fragmentation > | DoMeasureFragmentation () const override |
| | Returns fragmentation information for the allocator's memory region.
|
| |
| Result< Layout > | DoGetInfo (InfoType info_type, const void *ptr) const override |
| |
| void | Init (BlockType *begin) |
| |
| template<typename Ptr > |
| internal::copy_const_ptr_t< Ptr, BlockType * > | FromUsableSpace (Ptr ptr) const |
| |
| virtual void | DeallocateBlock (BlockType *&&block) |
| |
|
constexpr | GenericBlockAllocator (Capabilities capabilities) |
| |
|
constexpr | Allocator ()=default |
| | TODO(b/326509341): Remove when downstream consumers migrate.
|
| |
|
constexpr | Allocator (const Capabilities &capabilities) |
| |
| virtual void * | DoAllocate (Layout layout)=0 |
| |
| virtual bool | DoResize (void *ptr, size_t new_size) |
| |
| virtual void * | DoReallocate (void *ptr, Layout new_layout) |
| |
| virtual size_t | DoGetAllocated () const |
| |
| virtual std::optional< Fragmentation > | DoMeasureFragmentation () const |
| | Returns fragmentation information for the allocator's memory region.
|
| |
|
constexpr | Deallocator ()=default |
| | TODO(b/326509341): Remove when downstream consumers migrate.
|
| |
|
constexpr | Deallocator (const Capabilities &capabilities) |
| |
|
template<typename BlockType > |
| static constexpr Capabilities | GetCapabilities () |
| |
| static void | CrashOnAllocated (const void *allocated) |
| |
| static void | CrashOnOutOfRange (const void *freed) |
| |
|
static void | CrashOnDoubleFree (const void *freed) |
| | Crashes with an informational message that a given block was freed twice.
|
| |
|
template<typename T > |
| static constexpr bool | is_bounded_array_v = ::pw::is_bounded_array_v<T> |
| |
|
template<typename T > |
| static constexpr bool | is_unbounded_array_v = ::pw::is_unbounded_array_v<T> |
| |