Недавно мне было поручено реализовать буфер, который будет использоваться в качестве временного хранилища классом журналирования. Сам класс ведения журнала является одноэлементным, и используется шаблон слушателя наблюдателя. Вы можете ожидать, что с помощью этого класса будут регистрироваться тысячи сообщений.
Проблема заключается в следующем:
У нас есть опция ведения журнала трассировки, которая используется для отладки. Когда эта опция включена, количество сообщений в секунду увеличивается экспоненциально. В коде выпуска ведение журнала трассировки отключено, однако буфер, который может хранить фиксированное количество сообщений, например. 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, чтобы использовать постоянное время выполнения удаления / вставки. ( не просите о преобразовании в пустоту, а не о моем решении ).
Но поскольку размер буфера фиксирован и вряд ли будет изменен в течение жизненного цикла объекта, может быть, вектор с явным манипулированием индексом более подходит? Например, может быть два индекса, start / current, начиная с позиции 0. Когда вектор заполнен, и мы добавляем что-то, start перемещается в позицию 1, а current - в позицию 0, таким образом, при печати результата у нас есть правильный порядок.
Может быть, для такого рода вещей больше подходит другой контейнер STL?
Спасибо за терпение, чтобы прочитать эту длинную стену текста. Я здесь, чтобы ответить на любые вопросы.