Managing memory with multiple heaps
You can use XL C/C++ to create and manipulate your own memory heaps, either in place of or in addition to the default XL C/C++ runtime heap.
You can create heaps of regular memory or shared memory, and you can have any number of heaps of any type. The only limit is the space available on your operating system (the memory and swapper size of your system minus the memory required by other running applications). You can also change the default runtime heap to a heap that you have created.
Using your own heaps is optional, and your applications can work well using the default memory management provided (and used by) the XL C/C++ runtime library. However, using multiple heaps can be more efficient and can help you improve your program's performance and reduce wasted memory for a number of reasons:
- When you allocate from a single heap, you can end up with memory
blocks on different pages of memory. For example, you might have a
linked list that allocates memory each time you add a node to the
list. If you allocate memory for other data in between adding nodes,
the memory blocks for the nodes could end up on many different pages.
To access the data in the list, the system might have to swap many
pages, which can significantly slow your program.
With multiple heaps, you can specify the heap from which you want to allocate. For example, you might create a heap specifically for a linked list. The list's memory blocks and the data they contain would remain close together on fewer pages, which reduces the amount of swapping required.
- In multithreaded applications, only one thread can access the
heap at a time to ensure memory is safely allocated and freed. For
example, if thread 1 is allocating memory, and thread 2 has a call
to
free, thread 2 must wait until thread 1 has finished its allocation before it can access the heap. Again, this can slow down performance, especially if your program does a lot of memory operations.If you create a separate heap for each thread, you can allocate from them concurrently, eliminating both the waiting period and the overhead required to serialize access to the heap.
- With a single heap, you must explicitly free each block that you
allocate. If you have a linked list that allocates memory for each
node, you have to traverse the entire list and free each block individually,
which can take some time.
If you create a separate heap only for that linked list, you can destroy it with a single call and free all the memory at once.
- When you have only one heap, all components share it (including
the XL C/C++ runtime library, vendor libraries, and your own code).
If one component corrupts the heap, another component might fail.
You might have trouble discovering the cause of the problem and where
the heap was damaged.
With multiple heaps, you can create a separate heap for each component, so if one damages the heap (for example, by using a freed pointer), the others can continue unaffected. You also know where to look to correct the problem.