Пару лет назад, когда я работал во встроенных системах, нам нужно было явно контролировать распределение памяти наших структур.
Представьте себе этот тип структуры:
.h file
template<class T,uint16 u16Entries>
class CMemoryStruct
{
public:
/**
*Default c'tor needed for every template
*/
CMemoryStruct(){};
/**
*Default d'tor
*/
~CMemoryStruct(){};
/**
*Array which hold u16Entries of T objects. It is defined by the two template parameters, T can be of any type
*/
static T aoMemBlock[u16Entries];
/**
*Starting address of the above specified array used for fast freeing of allocated memory
*/
static const void* pvStartAddress;
/**
*Ending address of the above specified array used for fast freeing of allocated memory
*/
static const void* pvEndAddress;
/**
*Size of one T object in bytes used for determining the array to which the necessary method will be invoked
*/
static const size_t sizeOfEntry;
/**
*Bitset of u16Entries which has the same size as the Array of the class and it is used to specify whether
*a particular entry of the templated array is occupied or not
*/
static std::bitset<u16Entries> oVacancy;
};
/**
*Define an array of Type[u16Entries]
*/
template<class Type,uint16 u16Entries> Type CMemoryStruct<Type,u16Entries>::aoMemBlock[u16Entries];
/**
*Define a const variable of a template class
*/
template<class Type,uint16 u16Entries> const void* CMemoryStruct<Type,u16Entries>::pvStartAddress=&CMemoryStruct<Type,u16Entries>::aoMemBlock[0];
template<class Type,uint16 u16Entries> const void* CMemoryStruct<Type,u16Entries>::pvEndAddress=&CMemoryStruct<Type,u16Entries>::aoMemBlock[u16Entries-1];
template<class Type,uint16 u16Entries> const size_t CMemoryStruct<Type,u16Entries>::sizeOfEntry=sizeof(Type);
/**
*Define a bitset inside a template class...
*/
template<class Type,uint16 u16Entries> std::bitset<u16Entries> CMemoryStruct<Type,u16Entries>::oVacancy;
В зависимости от вашего компилятора и среды вы можете манипулировать областью статического размещения.В нашем случае мы перенесли это в ПЗУ, которого было много.Также обратите внимание, что в зависимости от вашего компилятора, т.е. компиляторов Greenhills, вам может понадобиться использовать ключевое слово export и определить статические члены в файле .cpp.
Вы можете использовать начальный и конечный указатели для навигации по данным.Если ваш компилятор поддерживает полный STL, вы можете использовать std :: vectors с пользовательскими распределителями и перегружать новые операторы, которые сохранят вашу память где-то еще, кроме стека.В нашем случае новые операторы были перегружены таким образом, что все выделение памяти было сделано на предопределенных структурах памяти.
Надеюсь, я дал вам идею.