pubsetbuf
まず、実装定義であることに注意してください。gcc では新しいバッファを設定しますが、たとえば MSVC では何も起こりません (setbuf
何もしない基本クラスを呼び出します)。
ここで述べたように、オーバーフローsputn
を呼び出します(または、他の方法で呼び出した効果を達成します):
put 領域がいっぱいになると (pptr() == epptr())、この関数は、overflow() を呼び出すか、overflow() を呼び出した効果を他の不特定の手段で達成する可能性があります。
オーバーフローのドキュメントによると:
pbase() で始まる文字の最初のサブシーケンスを出力シーケンスに保存し、出力領域へのポインターを更新することにより (必要な場合)、プット領域に少なくとも 1 文字分のスペースがあることを確認します。ch が traits::eof() でない場合 (つまり、traits::eq_int_type(c, traits::eof()) != true)、出力領域に配置されるか、出力シーケンスに直接保存されます。
この関数は、さらにデータを書き込む場所を定義するために、pptr、epptr、および pback ポインターを更新する場合があります。失敗した場合、関数は pptr() == nullptr または pptr() == epptr のいずれかを保証します。
基本的に、これが意味することは、より多くのデータに適合するようにバッファーのサイズを適切に変更できるということであり、gcc ではまさにこれが起こっています。実際のコードはここから取得します:
const __size_type __opt_len = std::max(__size_type(2 * __capacity), __size_type(512));
const __size_type __len = std::min(__opt_len, __max_size);
512
ご覧のとおり、文字列バッファーが到達できる最大サイズに達するまで、容量を 2 倍にするか、サイズを に設定します。