gpt4 book ai didi

c++ - 循环缓冲区优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:08 25 4
gpt4 key购买 nike

我有一个大小为 2 的幂的循环缓冲区。我的目标是优化它的工作。这是简短的代码:

class CircularBuffer
{
public:
CircularBuffer(unsigned int bufferSize); // align this size to power of 2
void read(char * dst, unsigned int bytes);
void write(char * src, unsigned int bytes);
private:
unsigned int m_readOffset;
unsigned int m_writeOffset;
std::vector<char> m_buffer;
};

CircularBuffer::write(char * src, unsigned int bytes)
{
int dif = bytes - (m_buffer.size() - m_writeOffset);
unsigned int mask = ~(dif >> 31); // 0 or 0xFFFFFFFF
dif &= mask; // now i know how much bytes i need to put at the beginning of the buffer
memcpy(&m_buffer[m_writeOffset], src, bytes - dif);
memcpy(&m_buffer[0], src + bytes - dif, dif);
m_writeOffset = (m_wirteffset + bytes) & (m_buffer.size() -1);
}

m_writeOffset 表示缓冲区中已经放入了多少字节。如您所见,我摆脱了 if (remain size in buff < srcSize) 等条件,并使用位掩码计算 writeOffset。

但是我的首席程序员告诉我有一种方法可以使用按位运算来计算在缓冲区末尾放置多少字节以及在缓冲区开头放置多少字节,因为缓冲区的大小是 2 的幂。有什么建议吗?

最佳答案

您已经在使用无符号变量来跟踪队列的前端和后端(这很好);只需在每次写入(入队)操作时增加 m_writeOffset 并在每次读取(出队)操作时增加 m_readOffset。计算缓冲区元素的剩余数量非常简单:

// returns the distance between m_readOffset and m_writeOffset
// (the count of the actual buffer elements):
uint32_t CircularBuffer::Size()
{
if (m_readOffset < m_writeOffset)
{
return (m_writeOffset - m_readOffset);
}
else
{
return (m_readOffset - m_writeOffset);
}
}

查看我的 base-2 循环队列的 STL 模板实现的源代码:

CircularQueue.h

CircularQueue.cpp

关于c++ - 循环缓冲区优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com