2014-04-05 186 views
2

我有一個大小爲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的冪。任何建議?

+2

你爲什麼不問那個告訴你有什麼方法的人? –

+0

請注意,低級別技巧!=高效代碼。試試標準庫循環緩衝區(['std :: deque'](http://en.cppreference.com/w/cpp/container/deque))並對其進行配置。 – Manu343726

+2

低級技巧=難以閱讀並且充滿了錯誤。看起來你的主要程序員是「聰明」,但不聰明。 「聰明」的程序員只會造成麻煩。你看,如果你試圖通過代碼審查得到你的::寫入方法,我會要求你在C++標準中查找右移一個負整數的結果是什麼,以及它究竟在哪裏表示標誌是重複的。然後你會被卡住,因爲你不會找到這些信息,因爲它不在那裏。右移一個負整數是實現定義的,而不是可移植的。 – gnasher729

回答

0

您已經在使用無符號變量來跟蹤隊列的正面和背面(這很好);在每次讀(排隊)操作時簡單地增加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); 
    } 
} 

查閱的源代碼到我的STL模板實現一個基數爲2的循環隊列的:

CircularQueue.h

CircularQueue.cpp