namespace ManagedMemory
{
using namespace std;
MemoryManagerImpl::MemoryManagerImpl(void *p, size_t heapSize):
_heapSize(heapSize),
_heap(p)
{
_freeBlocks.push_front(MemBlock(_heap, _heapSize));
}
MemoryManagerImpl::~MemoryManagerImpl(void)
{
}
void * MemoryManagerImpl::alloc(size_t amount) throw(MemoryAllocationException)
{
for(list
{
if(it->_size >= amount)
{
void *memPointer = it->_pointer;
size_t memResidua = it->_size - amount;
_freeBlocks.erase(it);
_usedBlocks.push_back(MemBlock(memPointer, amount));
if(memResidua > 0)
_freeBlocks.push_back(
MemBlock(reinterpret_cast
reinterpret_cast
memResidua));
return memPointer;
}
}
return 0;
}
void MemoryManagerImpl::free(void *p) throw(NotOwnedMemoryException, DeallocOnNotAllocatedMemory)
{
if(
( reinterpret_cast
( reinterpret_cast
) throw NotOwnedMemoryException();
for(list
{
if(it->_pointer == p)
{
_freeBlocks.push_back(*it);
defrag();
_usedBlocks.erase(it);
return;
}
}
throw DeallocOnNotAllocatedMemory();
}
void MemoryManagerImpl::defrag()
{
if(_freeBlocks.size() < 2) return;
_freeBlocks.sort();
list
list
it2++;
while(it2 != _freeBlocks.end())
{
if(
(reinterpret_cast
it1->_size) == (reinterpret_cast
{
// Unisco e libero
_freeBlocks.push_back(MemBlock(it1->_pointer, it1->_size + it2->_size));
_freeBlocks.erase(it2);
_freeBlocks.erase(it1);
// Ricomincio
if(_freeBlocks.size() < 2) return;
_freeBlocks.sort();
it1 = _freeBlocks.begin();
it2 = _freeBlocks.begin();
it2++;
}
else
{
it1++;
it2++;
}
}
}
};
2 commenti:
questa cosa è interessante... Sono un neofita di c++ ma a quanto ho capito questa funzione alloca della memoria e la riserva .. è possibile poi scrivere in questa memoria del codice asm? E allocare, se libero, sempre lo stesso offset?
Il memory manager che propongo qui è un'implementazione molto semplice del concetto (appunto!) di gestore di memoria, compito tipicamente riservato al sistema operativo. Ho utilizzato un gestore di memoria di questo tipo (effettivamente era un sistema decisamente più sofisticato) su un sistema embedded. Dubito che possa essere utile nel mondo dei personal computer, se non per scopo didattico...
Posta un commento