Как повторно использовать Stack Allocator в RapidJSON без перераспределения памяти

Я запускаю однопоточную систему в FreeRTOS с ограниченными ресурсами.

Я уже заранее выделяю буферы для распределителей RapidJSON следующим образом:

char            valueBuffer[2048];
char            parseBuffer[1024];
rapidjson::MemoryPoolAllocator<FreeRTOSRapidJSONAllocator> valueAllocator (valueBuffer, sizeof(valueBuffer))
rapidjson::MemoryPoolAllocator<FreeRTOSRapidJSONAllocator> parseAllocator (parseBuffer, sizeof(parseBuffer));

У меня проблема в том, что каждый раз, когда используется один из распределителей, его размер продолжает увеличиваться (и при необходимости выделять новую память), если они не очищаются. Проблема с вызовом Clear() для распределителей заключается в том, что Malloc вызывается снова при следующем изменении размера распределителей, чего я хочу избежать.

Есть ли способ просто повторно использовать существующую предварительно выделенную память, например, установив размер распределителей обратно на ноль?


person Cigogne Eveillée    schedule 02.10.2020    source источник


Ответы (1)


Я решил это, создав собственный распределитель. По сути копия rapidjson::MemoryPoolAllocator с добавлением следующего метода:

void Reset()
{
    chunkHead_->size = 0;
    chunkHead_->next = 0;
}

Который следует вызывать каждый раз, когда вы закончите с последней проанализированной строкой.

person Cigogne Eveillée    schedule 06.10.2020