簡單介紹:
環形緩衝區就是在最開始的時候申請乙個大buffer,有乙個讀指標,乙個寫指標,隨著資料寫入和讀取改變讀寫指標,具體分為三總情況:
1、是讀寫速度差不多,這種情況比較簡單。
3、就是讀速度快,這種情況也比較簡單,直接返回即可。下面我們來分析一下我的具體讀寫**:
buffer的大小根據讀寫指標的快慢合理設定,可以提高記憶體利用,節約空間資源
環形緩衝區的優缺點:
優點整個軟體宣告週期都是使用的這個環形緩衝區不用重新釋放和分配空間,這樣節省了時間提高了效率。
缺點由於對環形緩衝區的空間大小是最開始就定義好的,如果這個大小估計不準確,太大的話浪費空間,太小的話,就得重新分配空間裝下新的資料,這就和普通緩衝區沒區別了。所以,其實環形緩衝區在伺服器程式設計中的大部分情況下都是很少使用的。
環形快取區結構上雖然是環形的,但本質上還是線性的,只是通過移動讀寫指標達到環形的效果
否則的話,還是老老實實用最基本、最簡單的快取區
注意:環形緩衝區一般都是非執行緒安全的。
#ifndef _circle_buffer_hpp_#define _circle_buffer_hpp_#include
template
class
circlebuffer
//析構函式
~circlebuffer()
}//快取區是否滿
bool
isfull()
//判空
bool
isempty()
//清空快取區
void
clear()
//獲取寫入記憶體的大小
intgetlength()
else
if(m_bfull)
else
if (m_nreadpos else
}//向快取區中寫資料,返回實際寫入的位元組數
int write(t* buf, int
count)
//緩衝區為空時
else
if (m_nreadpos ==m_nwritepos)
else
}//有剩餘空間,寫指標在讀指標前面
else
if (m_nreadpos //寫指標右邊剩餘空間不足以放下資料
else
}//讀指標在寫指標前面
else
else}}
//從緩衝區讀資料,返回實際讀取的位元組數
int read(t* buf, int
count)
//緩衝區滿時
else
if (m_nreadpos ==m_nwritepos)
else
}//寫指標在前(未讀資料是連續的)
else
if (m_nreadpos //讀指標在前
else
//需要讀出的資料是不連續的,分別在讀指標右邊和寫指標左邊
else}}
intgetreadpos()
intgetwritepos()
private
:
bool
m_bempty, m_bfull;
//環形快取區頭指標
t * m_pbuf=nullptr;
//環形快取區大小
size_t m_nbufsize;
//可讀指標位置(頭)
intm_nreadpos;
//可寫指標位置(尾)
intm_nwritepos;
};#endif
//!_circle_buffer_hpp_
#include#include#include
"circlebuffer.hpp
"using
namespace
std;
intmain()
;
if (a.read(out, 5
))
cout
<< a.getlength() <}
//---寫指標在前,寫指標右邊剩餘記憶體寫不下資料,但是讀指標左邊記憶體夠寫下資料
;
char in2[2] = ;
char in3[2] = ;
a.write(in1,
2) ;
a.write(in2,
2) ;
a.write(in3,
2) ;
char out[10] ={};
if (a.read(out, 2
))
cout
<< "
readpos=
"<< a.getreadpos()
<< "
writepos=
"<< a.getwritepos()
a.write(in4, 2);
cout
<< "
readpos=
"<< a.getreadpos()
<< "
writepos=
"<< a.getwritepos()
))
cout
<< a.getlength() <}
//---寫指標在前,寫指標右邊剩餘記憶體寫不下資料,讀指標左邊記憶體也不夠寫下資料
cout << "
寫指標在前,寫指標右邊剩餘記憶體寫不下資料,讀指標左邊記憶體也不夠寫下資料
"
a(8
);
char in1[2] = ;
char in2[2] = ;
char in3[2] = ;
a.write(in1, 2);
a.write(in2, 2);
a.write(in3, 2);
char out[10] ={};
if (a.read(out, 2
))
cout
<< "
readpos=
"<< a.getreadpos()
<< "
writepos=
"<< a.getwritepos()
a.write(in4, 4);
cout
<< "
readpos=
"<< a.getreadpos()
<< "
writepos=
"<< a.getwritepos()
))
cout
<< a.getlength() /---讀指標在前,讀指標右邊剩餘記憶體能讀出資料
//---讀指標在前,讀指標右邊剩餘記憶體不能完整讀出資料,但是加上寫指標左邊記憶體能完整讀出資料
//---讀指標在前,讀指標右邊剩餘記憶體不能完整讀出資料,加上寫指標左邊記憶體也不能完整讀出資料
system("
pause");
return0;
}
環形緩衝區的c實現
標頭檔案 ifndef xbuf h define xbuf h define xbufdefaultsize 1024 1024 緩衝區預設大小 typedef unsigned int uint32 建立乙個環形緩衝區 size為緩衝區大小 void x buf create uint32 si...
環形快取區設計原始碼
下面是本人寫的環形快取區,請高手指正 優化,大家一起交流。definedata size512 協議最長幀位元組數 2 若干位元組 defineframe headerlength5 幀頭長度 definedata longth location13 定義資料位置長度,計算方法 資料域長度 固定位元...
環形快取區(redux saga應用例項)
環形緩衝器 ringr buffer 也稱作圓形佇列 circular queue 迴圈緩衝區 cyclic buffer 圓形緩衝區 circula buffer 是一種用於表示乙個固定尺寸 頭尾相連的緩衝區的資料結構,適合快取資料流。實現例項 這裡定義圓形快取器 function ringbuf...