1

私の理解では、printfのほとんどの実装は次のようなものに依存しています

vsnprintf( _acBuffer[0], sizeof( _acBuffer[0] ), pcFormat, *ptArgList );

実際にフォーマットを処理し、プットを介してストリームに出力します。

すべての文字列を出力する機能を維持しながら、必要な _acBuffer[0] のサイズを最小限に抑える実装はありますか?

明らかに次のようなもの:

printf("%s", pcReallyLongString);

問題になるでしょう。

あなたの考えは大歓迎です!

4

2 に答える 2

4

あなたの理解は間違っています。printf最初に出力全体を一時的な文字列バッファーにフォーマットすることで機能する実装を見たり聞いたりしたことがありません。通常、printf は逆の方法で実行されます。基本的なビルディング ブロックはvfprintf、バッファーが宛先文字列でvsnprintfある偽物を作成するラッパーです。FILE

編集:一部の一般的な (glibc など) 実装で、特定の形式、特にワイド文字変換に対して無制限に大きな中間バッファーを使用しており、バッファーに十分なメモリを割り当てられない場合に予期せず失敗します。ただし、これは純粋に低品質の実装の問題です。printf関数が出力する内容に関係なく、一定量の小さな作業スペース以上を必要とする基本的な理由はありません。

于 2012-07-06T21:09:30.950 に答える
2

fprintf(または)仕様の要点はprintf、この関数の「バッファレス」ワンパス実装を許可する方法であると言えます。つまり、データを 1 つずつ順番に変換し (変換が必要な場合)、すぐにそれを出力に送信し、完全に忘れます。この関数は、数値データの変換に中間バッファーを使用できますが、これはコンパイル時の固定サイズで重要でない一時バッファーです。

私が何かを見逃していない限り、適切に実装されたfprintf関数は、結果の文字列の長さにまったく制限を課すべきではありません。あなたの仮想的な実装vsnprintfは、その原則に違反します。

于 2012-07-06T21:56:30.423 に答える