2

C ++では、

std::cout << 1.2;

実際に数値を表示するために呼び出される実際の関数のチェーンは何ですか?これはコンパイラ固有であることに気づきましたが、特にGnulibstdc++の実装に興味があります。

Cでは、printfを呼び出すとvfprintfに委任され、ジャンプテーブルを介してglibcの__printf_fpが呼び出されます。純粋なC++設定で類似のチェーンを探しています。

4

1 に答える 1

2

明らかに、最初にostream :: operator <<を呼び出しますが、それを超えるとライブラリ固有の場合があります。これに答える最良の方法は、コードをデバッグし、関数が発生したときにそれに従うことです。これにより、呼び出される関数がわかるだけでなく、発生するエッジケースとエラー処理についてもわかります。コードを見ると役立つかもしれませんが、複雑になる可能性があります。

このコードの使用:

std::cout << 1.2f;

...これがVisualStudio2012でノイズなしで何が行われるかです。

  1. 演算子<<(float _Val)(std :: basic_ostream <_Elem、_Traits>)
    1. 状態変数をgoodに初期化します。
    2. use_facet <_Facet>(const locale&_Loc)(std)を呼び出して、num_putファセットを取得します。
    3. num_put (_OutIt _Dest、ios_base&_Iosbase、_Elem _Fill、double _Val)(std)を呼び出して、ローカル固有のフォーマットを使用してフロートを出力ストリーム(doubleに変換)に書き込みます。内部的には、これは:
      1. 固定などの精度をチェックして、デフォルトのフォーマットが変更されているかどうかを確認します。
      2. 数値をフォーマットし、ストリームで使用されている現在のイテレータへの文字として出力に書き込みます。
    4. 操作が失敗した場合は、状態変数をbadに設定します。
    5. setstateをその状態に呼び出します。

したがって、ほとんどの作業は実際にはnum_putファセットで行われ、出力ストリームのイテレータに書き込みます。

于 2012-10-02T23:28:47.683 に答える