Недавно мне было поручено реализовать буфер, который будет использоваться в качестве временного хранилища классом журналирования. Сам класс регистрации является одноэлементным, и используется шаблон слушателя-наблюдателя. Вы можете ожидать, что тысячи сообщений будут зарегистрированы с этим классом.
Теперь проблема заключается здесь:
У нас есть опция ведения журнала трассировки, которая используется для отладки. Когда эта опция включена, количество сообщений в секунду увеличивается в геометрической прогрессии. В коде выпуска кода трассировка отключена, однако буфер, который может хранить фиксированное количество сообщений, например, 10000 сбрасывается в журнал ЕСЛИ возникает ошибка, так что разработчики могут определить корень проблемы.
Если буфер заполнен, самое старое сообщение удаляется, чтобы освободить место для самого нового сообщения.
void Log::storeToBuffer(const LogType_E & type_in, const LogDomain_E & domain_in,const int & id_in, const char * msg_in)
{
if(this->myEnableTraceBuffer)
{
if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() < this->myRingBufferMaxSize)
{
static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
}
else
{
//buffer full so remove oldest element and add new
if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() > 0) static_cast<std::list<Message> * >(this->myRingBuffer)->pop_front();
static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
}
}
}
Я реализовал это с помощью std :: list, очень просто используя push_back / pop_front, чтобы использовать постоянное время выполнения удаления / вставки. ( не спрашивайте о лишении свободы, не мое решение ).
Но так как размер буфера фиксирован и вряд ли изменится в течение времени жизни объекта, может быть, вектор с явным манипулированием индексом более подходит? Например, может быть два индекса: начальный / текущий, начиная с позиции 0. Когда вектор заполнен, и мы добавляем что-то, начало перемещается в положение 1, а текущее в положение 0, поэтому при печати результата мы имеем правильный порядок.
Может быть, другой контейнер STL больше подходит для такого рода вещей?
Спасибо за ваше терпение прочитать эту длинную стену текста. Я здесь, чтобы ответить на любые вопросы.