Справочная информация: Мы используем Keil для компиляции нашего проекта NXP LPC2458.Есть множество задач, которые выполняются в RealView RTOS Keil.Создано пространство стека, которое выделяется для каждой задачи.Нет HEAP, созданного по умолчанию, и я хочу избежать этого, так как мы не можем позволить себе накладные расходы на пространство кода и затраты на «сбор мусора»
Цель: использовать C ++ во встроенном коде без использованиякуча.Keil предоставляет #pragma (__use_no_heap), который предотвращает связывание вызовов malloc () и free ().
Решение: я попытался создать Singleton с частным статическим указателем.Я надеялся, что new () не будет вызываться, так как я объявил dlmData как статический в getDLMData ().По какой-то причине компоновщик по-прежнему заявляет, что malloc () и free () вызываются.У меня есть мысли о частном операторе new () и частном операторе delete (), а затем о объявлении dlmData как статического в перегруженной функции.Это не работает по какой-то причине.ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО?
//class declaration
class DataLogMaintenanceData
{
public:
static DataLogMaintenanceData* getDLMData();
~DataLogMaintenanceData()
{ instanceFlag = FALSE; }
protected:
DataLogMaintenaceData(); //constructor declared protected to avoid poly
private:
static Boolean instanceFlag;
static DataLogMaintenceData *DLMData;
}
//set these to NULL when the code is first started
Boolean DataLogMaintenanceData::instanceFlag = FALSE;
DataLogMaintenanceData *DataLogMaintenaceData::DLMData = NULL;
//class functions
DataLogMaintenanceData *DataLogMaintenanceData::getDLMData()
{
if (FALSE == instanceFlag)
{
static DataLogMaintenanceData dlmData;
DLMData = &dlmData;
instanceFlag = TRUE;
return DLMData;
}
else
{
return DLMData;
}
}
void InitDataLog ( void )
{
DataLogMaintenanceData *dlmData;
dlmData = DataLogMaintenanceData::getDLMData();
// to avoid dlmData warning
dlmData = dlmData;
}
//ACTUAL TASK
__task DataLog()
{
.. .. .. code to initialize stuff
InitDataLog();
.. .. ..more stuff
}
По какой-то причине единственный способ, которым я могу заставить это скомпилировать, состоит в том, чтобы создать пространство кучи и затем позволить вызовам malloc () и free () компилироватьсяв проект.Как и ожидалось, «статический» определенный объект-союзник, dlmData, находится в пространстве ОЗУ, выделенном для модуля dataLog.o (т.е. он не находится в HEAP).
Я не могу понять,и я проверил Google, что мне не хватает?Возможно ли в C ++ обойти malloc () и free () при компиляции чистых объектов?Я знаю, что могу заменить реализацию malloc () и free () в ОСРВ, чтобы ничего не делать, но я хочу избежать компиляции в коде, который я не буду использовать.