boost中支持环形内存。该内存在一些地方还是蛮实用的。
简单看下具体使用及部分源码,使用和源码相对来说都还是比较简单,易于理解的
与STL接口基本一致
void CCircularBufferTest::TestCircularBuffer()
{
circular_buffer<CTest> aa(5); // 预先分配5个sizeof(CTest)的大小空间
aa.push_back(CTest(1)); // 插入元素
aa.push_back(CTest(2));
int isize = aa.size();
bool bfull = aa.full();
for (int i = 3; i <= 7; ++i)
{
aa.push_back(CTest(i)); // 再次插入会覆盖到最初进入的元素
}
CTest* pTest = aa.linearize(); // 转换为指针
CTest* pTest5 = pTest+4;
}
部分源码分析
构造函数
explicit circular_buffer(capacity_type buffer_capacity, const allocator_type& alloc = allocator_type())
: m_size(0), m_alloc(alloc) {
initialize_buffer(buffer_capacity);
m_first = m_last = m_buff;
}
保存能力,默认分配算法
里面有m_first,m_last,m_buffer保存着该环形内存的各个位置状态
初始化该能力的空间
//! Initialize the internal buffer.
void initialize_buffer(capacity_type buffer_capacity) {
m_buff = allocate(buffer_capacity);
m_end = m_buff + buffer_capacity;
}
继续往下调用allocate。再往下就是调用::operator new,没有调用C++的new,因为此处是分配原始内存,没有构造函数的
//! Allocate memory.
pointer allocate(size_type n) {
if (n > max_size())
throw_exception(std::length_error("circular_buffer"));
#if BOOST_CB_ENABLE_DEBUG
pointer p = (n == 0) ? 0 : m_alloc.