I have a strong use case for pre-allocating all the memory I need upfront and releasing it upon completion.
I have came out with this real simple buffer pool C++ implementation which I have to test but I am not sure that the pointer arithmetic I am trying to use will allow me to do that. Basically the bit where I do next and release. I would prefer some trick around this idea and not relying on any sort of memory handler which just makes the client code more convoluted.
#include <stdio.h> #include <queue> #include "utils_mem.h" using namespace std; template <class T> class tbufferpool { private: const int m_initial; const int m_size; const int m_total; T* m_buffer; vector<T*> m_queue; public: // constructor tbufferpool(int initial, int size) : m_initial(initial), m_size(size), m_total(initial*size*sizeof(T)) { m_buffer = (T*) malloc(m_total); T* next_buffer = m_buffer; for (int i=0; i < initial; ++i, next_buffer += i*size) { m_queue.push_back(next_buffer); } } // get next buffer element from the pool T* next() { // check for pool overflow if (m_queue.empty()) { printf("Illegal bufferpool state, our bufferpool has %d buffers only.", m_initial); exit(EXIT_FAILURE); } T* next_buffer = m_queue.back(); m_queue.pop_back(); return next_buffer; } // release element, make it available back in the pool void release(T* buffer) { assert(m_buffer <= buffer && buffer < (buffer + m_total/sizeof(T))); m_queue.push_back(buffer); } void ensure_size(int size) { if (size >= m_size) { printf("Illegal bufferpool state, maximum buffer size is %d.", m_size); exit(EXIT_FAILURE); } } // destructor virtual ~tbufferpool() { free(m_buffer); } };
pop_back()...