簡體   English   中英

循環緩沖區優化

[英]Circular buffer optimizations

我有一個大小為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(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);
    }
} 

查看我的以2為基的循環隊列的STL模板實現的源代碼:

循環隊列

CircularQueue.cpp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM