class KZoneAllocator

Memory allocator for large groups of small objects. More...

Definition#include <kallocator.h>
List of all Methods
Annotated List
Files
Globals
Hierarchy
Index

Public Methods

Protected Types

Protected Methods

Protected Members


Detailed Description

Memory allocator for large groups of small objects. This should be used for large groups of objects that are created and destroyed together. When used carefully for this purpose it is faster and more memory efficient than malloc. Additionally to a usual obstack like allocator you can also free the objects individually. Because it does no compaction it still is faster then malloc()/free(). Depending on the exact usage pattern that might come at the expense of some memory though.

 KZoneAllocator (unsigned long _blockSize = 8*1024)

KZoneAllocator

Creates a KZoneAllocator object.

Parameters:
_blockSizeSize in bytes of the blocks requested from malloc.

 ~KZoneAllocator ()

~KZoneAllocator

Destructs the ZoneAllocator and free all memory allocated by it.

void*  allocate (size_t _size)

allocate

Allocates a memory block.

Parameters:
_sizeSize in bytes of the memory block. Memory is aligned to the size of a pointer.

void  deallocate (void *ptr)

deallocate

Gives back a block returned by allocate() to the zone allocator, and possibly deallocates the block holding it (when it's empty). The first deallocate() after many allocate() calls (or the first at all) builds an internal data structure for speeding up deallocation. The consistency of that structure is maintained from then on (by allocate() and deallocate()) unless many more objects are allocated without any intervening deallocation, in which case it's thrown away and rebuilt at the next deallocate().

The effect of this is, that such initial deallocate() calls take more time then the normal calls, and that after this list is built, i.e. generally if deallocate() is used at all, also allocate() is a little bit slower. This means, that if you want to squeeze out the last bit performance you would want to use KZoneAllocator as an obstack, i.e. just use the functions allocate() and free_since(). All the remaining memory is returned to the system if the zone allocator is destroyed.

Parameters:
ptrPointer as returned by allocate().

void  free_since (void *ptr)

free_since

Deallocate many objects at once. free_since() deallocates all objects allocated after ptr, including ptr itself.

The intended use is something along the lines of:


 KZoneAllocator alloc(8192);
 void *remember_me = alloc.allocate(0);
 for (int i = 0; i < 1000; i++)
   do_something_with (alloc.allocate(12));
 alloc.free_since (remember_me);

Note, that we don't need to remember all the pointers to the 12-byte objects for freeing them. The free_since() does deallocate them all at once.

Parameters:
ptrPointer as returned by allocate(). It acts like a kind of mark of a certain position in the stack of all objects, off which you can throw away everything above that mark.

typedef QValueList MemList

MemList

[protected]

void  addBlock (MemBlock *b)

addBlock

[protected]

void  delBlock (MemBlock *b)

delBlock

[protected]

void  insertHash (MemBlock *b)

insertHash

[protected]

void  initHash ()

initHash

[protected]

MemBlock * currentBlock

currentBlock

[protected]

unsigned long blockSize

blockSize

[protected]

unsigned long blockOffset

blockOffset

[protected]

unsigned int log2

log2

[protected]

unsigned int num_blocks

num_blocks

[protected]

MemList ** hashList

hashList

[protected]

unsigned int hashSize

hashSize

[protected]

bool hashDirty

hashDirty

[protected]