最有效的写缓冲区的方式

Most efficient way to write a buffer

本文关键字:方式 缓冲区 有效      更新时间:2023-10-16

我必须写一个音频缓冲区,它被逐渐填充/读取。

现在我用

m_outputBuffer.erase(
            m_outputBuffer.begin(),
            m_outputBuffer.begin()+read_samples);

当从缓冲区读取read_samples样本时(我必须清除它以释放RAM)。但我知道erase()是非常昂贵的,所以我有什么替代方案,考虑到我基本上只需要将指针移动到缓冲区的第一个元素并释放开始的元素?

std::deque似乎是一个容器,最适合这样的东西。std::deque是一个随机访问容器,像std::vector一样,但在容器的开始(平销)有恒定的插入和删除复杂性,不像std::vector(以及在容器的末尾)。

最后我还是用

m_outputBuffer.erase(
            m_outputBuffer.begin(),
            m_outputBuffer.begin()+read_samples);

,因为它真的很有效:擦除是在一个块中完成的,剩下的数据在我的向量的开始被重新定位,因此没有指针改变。

不要使用c++。用C写,当然C也是c++的一个子集。

缓冲区由一个内存区域和两个指针组成,一个指向开始位置,一个指向结束位置。当数据传入时,将其添加到结束指针,直到换行。当数据输出时,增加读指针。您永远不需要删除或擦除数据。如果缓冲区溢出,很可能意味着出现了问题,您需要关闭系统——扩展它只会延长崩溃过程。