'm currently fighting my way through an example of Single-Threaded Variable-Size Memory Manager in a chapter of the Efficient C++ book by Dov Bulka &David Mayhew. Unfortuantely, I'm starting to get code that won't compile and I am having a hard time finding an online errata or contacting the authors.
For those familiar with the book, Chapter 6 covers rolling your own
memory manager.
My compile errors are with the lines saying
"error C2143: syntax error : missing ';' before '<'"
"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int '.
I'd love to be able to figure this out, but sadly, that's why I'm
reading the book; I am not sure how this is failing.
and in the end ,I want to write a memorypool which can support Multithreaded and Variable-Size Memory Manager Any help would be appreciated.
- wzcxjiao
For those familiar with the book, Chapter 6 covers rolling your own
memory manager.
My compile errors are with the lines saying
"error C2143: syntax error : missing ';' before '<'"
"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int '.
I'd love to be able to figure this out, but sadly, that's why I'm
reading the book; I am not sure how this is failing.
and in the end ,I want to write a memorypool which can support Multithreaded and Variable-Size Memory Manager Any help would be appreciated.
- wzcxjiao
Code:
#ifndef __MEN113_H__ #define __MEN113_H__ class MemoryChunk { public: MemoryChunk (MemoryChunk *nextChunk, size_t chunkSize); ~MemoryChunk() {delete[] mem; }; inline void *alloc (size_t size); inline void free (void* someElement); // Pointer to next memory chunk on the list. MemoryChunk *nextMemChunk() {return next;} // How much space do we have left on this memory chunk? size_t spaceAvailable() { return chunkSize - bytesAlreadyAllocated; } // this is the default size of a single memory chunk. enum { DEFAULT_CHUNK_SIZE = 4096 }; private: MemoryChunk *next; void *mem; // The size of a single memory chunk. size_t chunkSize; // This many bytes already allocated on the current memory chunk. size_t bytesAlreadyAllocated; }; MemoryChunk::MemoryChunk(MemoryChunk *nextChunk, size_t reqSize) { chunkSize = (reqSize > DEFAULT_CHUNK_SIZE) ? reqSize : DEFAULT_CHUNK_SIZE; next = nextChunk; bytesAlreadyAllocated = 0; mem = new char [chunkSize]; } //MemoryChunk :: ~MemoryChunk() { delete [] mem; }// void* MemoryChunk :: alloc (size_t requestSize) { void *addr = reinterpret_cast <void*> //(reinterpret_cast<size_t>( mem) + bytesAlreadyAllocated); //(static_cast ( _msize( mem) + bytesAlreadyAllocated); bytesAlreadyAllocated += requestSize; return addr; } inline void MemoryChunk :: free (void *doomed) {} class ByteMemoryPool { public: ByteMemoryPool (size_t initSize = MemoryChunk::DEFAULT_CHUNK_SIZE); ~ByteMemoryPool (); // Allocate memory from private pool. inline void *alloc (size_t size); // Free memory previously allocated from the pool inline void free (void* someElement); private: // A list of memory chunks. This is our private storage. MemoryChunk *listOfMemoryChunks; // Add one memory chunk to our private storage void expandStorage(size_t reqSize); }; // Construct the ByteMemoryPool object. Build the private storage. ByteMemoryPool :: ByteMemoryPool (size_t initSize) { expandStorage(initSize); } ByteMemoryPool :: ~ByteMemoryPool () { MemoryChunk *memChunk = listOfMemoryChunks; while (memChunk) { listOfMemoryChunks = memChunk->nextMemChunk(); delete memChunk; memChunk = listOfMemoryChunks; } } void* ByteMemoryPool :: alloc (size_t requestSize) { size_t space = listOfMemoryChunks->spaceAvailable(); if ( space < requestSize ) { expandStorage(requestSize); } return listOfMemoryChunks->alloc(requestSize); } inline void ByteMemoryPool :: free (void *doomed) { listOfMemoryChunks->free(doomed); } void ByteMemoryPool :: expandStorage(size_t reqSize) { listOfMemoryChunks = new MemoryChunk(listOfMemoryChunks, reqSize); } class Rational { public: Rational (int a = 0, int b = 1 ) : n(a), d(b) {} void *operator new(size_t size) {return memPool->alloc(size);} void operator delete(void *doomed,size_t size) {memPool->free(doomed);} static void newMemPool() { memPool = new ByteMemoryPool;} static void deleteMemPool() { delete memPool; } private: int n; // Numerator int d; // Denominator static ByteMemoryPool *memPool; }; #endif // the main file #include <windows.h> #include "iostream" #include"men113.h" //#include <vector> using namespace std; MemoryPool <Rational> *Rational::memPool = 0;// the failing int main() { //... Rational *array[1000]; Rational::newMemPool(); // Start timing here for (int j = 0; j < 500; j++) { for (int i = 0; i < 1000; i++) { array[i] = new Rational(i); } for (int i = 0; i < 1000; i++) { delete array[i]; } } // Stop timing here Rational::deleteMemPool(); // ... return 0; }
Comment