c 實現高效快取(鏈式buffer)

2021-10-01 07:10:14 字數 2317 閱讀 3819

如果我們從網路端接收的資料是不定長度的,不能提前分配好網路快取大小,則可以選擇使用鏈式快取的實現方式。鏈式快取主要是分配固定大小的快取鏈儲存資料,乙個管理器去管理這些快取鏈。

鏈式快取示例:

//一種鏈式緩衝

//ringbuffer是固定長度,不能夠擴充套件,鏈式buffer可以任意擴充

/** * buffer

* *first--chain buffer [1024]

* |--chain buffer

* |--chain buffer

* *datap--|--chain buffer

* *last---chain buffer

* */

#include #include #include using namespace std;

struct chain_buffer_mgr

;struct chain_buffer

;#define buffer_chain_size sizeof(struct chain_buffer)

#define buffer_chain_extra (t, c)(t *)((struct chain_buffer *)(c) + 1) //指向chain buffer 快取區

class chainbuffer

~chainbuffer(){}

void clear()

m_obuffermgr.first = nullptr;

m_obuffermgr.last_datap = nullptr;

m_obuffermgr.last = nullptr;

} void init(int bufsize)

void init(int chains, int bufsize)

else

}} void write(const char* buf, int size)

else

int write_len = 0;

int can_write_len = 0;

while (chain && size > 0)

if (chain->write_pos == 0 && size >= m_nbufsize)

else

memcpy(chain->buffer + chain->write_pos, buf + write_len, can_write_len);

size -= can_write_len;

chain->write_pos += can_write_len;

write_len += can_write_len;

m_obuffermgr.last_datap = chain;

if (chain->next == nullptr)

else

} }void read(char* buf, int size)

memcpy(buf + read_len, chain->buffer + chain->read_pos, can_read_len);

m_obuffermgr.total_len -= can_read_len;

read_len += can_read_len;

size -= can_read_len;

chain->read_pos += can_read_len;

if (chain->read_pos == chain->buffer_len)

}} int totaldatasize()

chain_buffer_mgr& getbuffermgr()

private:

size_t m_nbufsize;

chain_buffer_mgr m_obuffermgr;

};int main()

cout << endl;

char buf[22];

memset(buf, 0, sizeof(buf));

chainbuffer.read(buf, 21);

cout << buf << endl;

cout << endl;

chain = chainbuffer.getbuffermgr().first;

while (chain)

chainbuffer.clear();

}

上面是固定長度的鏈式快取,不能很好的應用與socket 接收,如果直接使用read、write 讀寫快取,可以參考下面提供的實現

使用方式:

(eventread、eventwrite 兩個函式)

c 實現迴圈快取buffer

迴圈buffer是一種高效快取方式,一般用於接收固定長度協議使用。如果使用不斷擴充套件的快取操作 見 則我們必須要malloc不斷擴張快取,還會memcpy或memmve操作,效率比較低,而ringbuffer則很好的規避這些低效操作。如果協議長度是固定的,則可以使用ringbuffer作為網路的接...

c 常用buffer實現

1 乙個buffer快取簡單實現 include include include include class buffer m cap m incr m begin m end 0 buffer int getbegin int getend int getcap int getleft int c...

C 實現的Buffer類

寫c 的同志一定覺得byte 比c 的 byte 加 length的方式好的多。一來,只需要乙個物件就可以是表示一段位元組流,另一方面,由於c 的特性,不需要象c 那樣還要記得刪除指標。由於我工作中,需要頻繁地試用c 和c 所以寫了個c 的類,以便方便地管理位元組流。很簡單,先定義乙個類 cmemo...