迴圈利用記憶體 環形緩衝區

2021-09-26 06:06:06 字數 3044 閱讀 5377

備份兩種重複利用記憶體,避免頻繁申請記憶體的方法。

databuffer.h

#ifndef databuffer_h

#define databuffer_h

#define buffer_size 1024 //初始緩衝區大小

class databuffer

;#endif // databuffer_h

databuffer.cpp

#include "databuffer.h"

#include "string.h"

#include //構造

databuffer::databuffer()

//析構

databuffer::~databuffer()

//獲得緩衝區中資料大小

int databuffer::getdatalen()

//重置緩衝區大小

bool databuffer::rebuffersize(int nlen)

m_pbuffer = new char[m_nbuffersize]; //分配新緩衝區

memset(m_pbuffer, 0, sizeof(m_pbuffer));

memcpy(m_pbuffer, obuffer, m_noffset); //將原緩衝區中的內容拷貝到新緩衝區

delete obuffer; //釋放原緩衝區

}catch(qexception e)

return true;

} /*

*功 能:向緩衝區中新增訊息

*參 數:pbuf:要新增的資料

* nlen:資料長度

*返回值:成功失敗

*/bool databuffer::addmsg(char *pbuf, int nlen)

catch(qexception e)

return true;}/*

*功 能:從緩衝區中取資料

*參 數:pbuf:二級指標,用於儲存取出的資料

* nlen:要取的資料長度

*返回值:無

*/void databuffer::popmsg(char **poutbuf, int nlen)

poll(nlen);

}//緩衝區復位

void databuffer::reset()

}//移除緩衝區首部第乙個資料報

//nlen:乙個資料報的大小

void databuffer::poll(int nlen)

}

databuffer.h

#ifndef netdatabuffer_h

#define netdatabuffer_h

#define buffer_size 1024 //初始緩衝區大小

class databuffer

;#endif // netdatabuffer_h

databuffer.cpp

#include "databuffer.h"

#include "string.h"

//#include //構造

databuffer::databuffer()

//析構

databuffer::~databuffer()

//獲得緩衝區中資料大小

int databuffer::getdatalen()

else if (m_nend < m_nstart)

else }

//重置緩衝區大小

bool databuffer::rebuffersize(int nlen)

m_pbuffer = new char[m_nbuffersize]; //分配新緩衝區

memset(m_pbuffer, 0, sizeof(m_pbuffer));

//將原緩衝區中的內容拷貝到新緩衝區

if (m_nstart < m_nend)

else

deleteobuffer; //釋放原緩衝區

return true;}/*

*功 能:向緩衝區中新增訊息

*參 數:pbuf:要新增的資料

* nlen:資料長度

*返回值:無

*/bool databuffer::addmsg(char *pbuf, int nlen)

if (getdatalen() + nlen > m_nbuffersize) //如果緩衝區過小,重新調整其大小

else if (m_nstart <= m_nend)

else

}else

m_isempty = false;

return true;

}//緩衝區復位

void databuffer::reset()}/*

*功 能:從緩衝區中取資料

*參 數:pbuf:二級指標,用於儲存取出的資料

* nlen:要取的資料長度

*返回值:無

*/void databuffer::popmsg(char **poutbuf, int nlen)

if (m_nstart < m_nend)

else

else

if (nlen <= rightlen) //如果資料報大小 < 緩衝區右面的資料

else

}poll(nlen);

}//移除緩衝區首部第乙個資料報

//nlen:乙個資料報的大小

void databuffer::poll(int nlen)

if (m_nstart < m_nend)

else

else

if (nlen <= rightlen) //如果資料報大小 < 緩衝區右面的資料

else

}}

借鑑

環形緩衝區

include include include include include define buffsize 1024 1024 define min x,y x y x y pthread mutex t lock pthread mutex initializer struct cycle b...

環形緩衝區

define print buf size 16 1024 static char g pcnetprintbuf 環形緩衝區的首位址 static int g ireadpos 0 環形緩衝區讀的位置 static int g iwritepos 0 環形緩衝區寫的位置 intinit 判斷環形緩...

環形緩衝區

環形緩衝區要維護兩個索引,分別對應寫入端 w 和讀取端 r 寫入 push 的時候,先確保環沒滿,然後把資料複製到 w 所對應的元素,最後 w 指向下乙個元素 讀取 pop 的時候,先確保環沒空,然後返回 r 對應的元素,最後 r 指向下乙個元素。上述的操作並不複雜,不過有乙個小小的麻煩 空環和滿環...