概要
自動で領域を拡張するバッファクラス。
https://github.com/0xfffffff7/AutoExtensionBuffer
今作ろうとしているOSSで使いたくなったので作った。
目的
パフォーマンス。
なるべく動的確保しない。
ソケットから取得したバッファをそれ以上コピーせずにそのまま使い回す。
ソケットのrecvで繰り返し受け取りながら、何も気にせずサイズを内部で拡張してくれるバッファが欲しかった。
特徴
●最初に4096バイトの内部静的領域を使う。
●4096バイトを超えたらダイナミックにバッファを確保してそちらを使う。
●ポインタに直接書き込む場合はtransction()とcommit()をセットで使う。
●1.2倍の猶予で拡張するので頻繁な動的確保を減らせる。
●あらかじめ使う領域が分かっている場合はreserve()で最初に予約もできる。
サンプル
AutoExtensionBuffer buf;
std::string str = "abcde";
// これはスタティックバッファを使う.
buf.write((int8_t*)str.c_str(), str.length());
// 先頭取得.
int8_t* p = buf.front();
// 書き込める最新の位置を取得.
p = buf.get();
// キャパシティの末尾を取得.
p = buf.last();
// 4096以上の文字列
str = "abcde.......";
// 内部でスタティック領域をやめて動的領域を使う。
buf.write((int8_t*)str.c_str(), str.length());
// これからソケットで書き込むサイズを指定
// 内部で領域を拡張.[(_length(実データ長) + 指定バイト) * 1.2]まで拡張する.
// キャパシティ内なら拡張されない.
p = buf.transaction(1024);
int r = socket.recv(p, buf.get_writable_size());
// 実際に書き込んだバイト数をコミットして実データ長を更新.
buf.commit(r);
// 少しずつコミット.
p = buf.transaction(1024);
// pに100バイト書き込む.
// コミット
buf.commit(100);
// pに200バイト書き込む.
// コミット
buf.commit(200);