intXX_t と int_fastXX_t の違いは何ですか? 質問する

intXX_t と int_fastXX_t の違いは何ですか? 質問する

私は最近、標準の存在を発見しました最速タイプ、主にint_fast32_tそしてint_fast64_t

主流のアーキテクチャで通常使用する場合は、古典的なものを使用する方が良いと常に言われてきました。整数長さこれは常にプロセッサのデフォルトの読み取り容量に適合し、無駄な数値変換を回避します。

C99 標準では、§7.18.1.3p2 に次のように記載されています。

「typedef 名 int_fastN_t は、少なくとも N の幅を持つ最速の符号付き整数型を指定します。typedef 名 uint_fastN_t は、少なくとも N の幅を持つ最速の符号なし整数型を指定します。」

また、§7.18.1.3p1にもこれに関する引用があります。

「指定された型がすべての目的において最速であることは保証されません。実装において、ある型を他の型よりも選択する明確な根拠がない場合、単に符号と幅の要件を満たす整数型が選択されます。」

私には何が分からない最速本当に意味するところはわかりません。この型をいつ使うべきか、いつ使うべきでないのかわかりません。

これについて少しグーグルで調べてみたところ、開ける ソース プロジェクト一部の機能は変更されましたが、すべてではありません。なぜ一部を変更したのかは説明されていません。のみ彼らのコードの一部です。

int_fastXX_tが使用される具体的なケース/使用法は何か知っていますか?本当に古典的なものよりも速いですか?

ベストアンサー1

C99 標準、7.18.1.3 最速の最小幅整数型。

(7.18.1.3p1) 「次の各型は、少なくとも指定された幅を持つすべての整数型の中で、通常最も高速に操作できる整数型を指定します。」

225) 「指定された型がすべての目的において最速であることは保証されません。実装において、ある型を他の型よりも選択する明確な根拠がない場合は、単に符号と幅の要件を満たす整数型が選択されます。」

そして

(7.18.1.3p2) 「typedef 名 int_fastN_t は、少なくとも N の幅を持つ最速の符号付き整数型を指定します。typedef 名 uint_fastN_t は、少なくとも N の幅を持つ最速の符号なし整数型を指定します。」

型と はint_fastN_tuint_fastN_t正確な幅の整数型と に対応しますintN_tuintN_t実装では、これらが少なくともNビットを取ることが保証されていますが、より大きな型を使用して最適化を実行できる場合は、実装でさらに多くのビットを取ることができます。つまり、これらが少なくとも ビットを取ることが保証されているだけですN

たとえば、32 ビット マシンでは、マシン ワード サイズ の型を操作する方が効率的であるため、を ではなくuint_fast16_tとして定義できます。unsigned intunsigned short

これらが存在するもう 1 つの理由は、C では正確な幅の整数型はオプションですが、最も高速な最小幅の整数型と最小幅の整数型 (int_leastN_tおよびuint_leastN_t) は必須であることです。

おすすめ記事