我最近被委托实现一个缓冲区,该缓冲区将作为日志类的临时存储。日志类本身是一个单例,并使用观察者监听器模式。您可以预期使用此类记录数千条消息。
现在问题在于:
我们有一个跟踪日志选项,用于调试目的。当启用此选项时,每秒钟记录的消息数量呈指数增长。在发布代码中,跟踪日志已禁用,但是如果发生错误,则会将一个可以存储固定数量消息(例如10000)的缓冲区转储到日志中,以便开发人员可以确定问题的根源。
如果缓冲区已满,则删除最旧的消息以释放空间以存储最新的消息。
现在问题在于:
我们有一个跟踪日志选项,用于调试目的。当启用此选项时,每秒钟记录的消息数量呈指数增长。在发布代码中,跟踪日志已禁用,但是如果发生错误,则会将一个可以存储固定数量消息(例如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,以利用常数时间的删除/插入执行时间。(不要问为什么需要 void 转换,这不是我的决定)。
但由于缓冲区大小是固定的,并且在对象的生命周期内不太可能发生更改,也许使用 vector 和显式索引操作更合适?例如,可以有两个索引,start/current,二者都从位置 0 开始。当向量已满并添加了某些内容时,start 移动到位置 1,current 移动到位置 0,因此在打印结果时我们会得到正确的顺序。
也许另一个 STL 容器更适合这种情况?
感谢您耐心阅读这段长文字。我将在此回答任何问题。
myRingBuffer
是一个指针?如果它真的是 你的 环形缓冲区,不与任何其他人共享,那么为什么不使用集合对象呢?好吧,在你没有启用它的情况下,一个空的集合比一个指针大,但并不是很大。还有一个相关的问题,你从哪种类型转换了这个指针? - Steve Jessop