1. ホーム
  2. c++

[解決済み] なぜ高速整数型は他の整数型より速いのか?

2022-05-16 13:57:29

疑問点

ISO/IEC 9899:2018(C18)では、7.20.1.3に記載されています。

7.20.1.3 最速の最小幅の整数の型

1 以下の各型は、通常最も高速な整数型を指定します。 268) で操作するのが最も速い整数型を指定します。

2 型定義名 int_fastN_t は,少なくともN個の幅を持つ最も高速な符号付き整数型であることを指定します. uint_fastN_t は,少なくとも N の幅を持つ最速の符号なし整数型を指定します.

3 以下の型が必要です。

int_fast8_t , int_fast16_t , int_fast32_t , int_fast64_t , uint_fast8_t , uint_fast16_t , uint_fast32_t , uint_fast64_t

このフォームの他のタイプはすべてオプションです。


268) 指定された型はすべての目的に対して最速であることを保証するものではありません。もし実装が他の型よりもある型を選ぶ明確な根拠がなければ、単に符号付きと幅の要件を満たす何らかの整数型を選ぶでしょう。


しかし、これらの "fast" 整数型がなぜ高速であるかは述べられていません。

  • なぜこれらの高速な整数型は他の整数型よりも高速なのですか?

のヘッダーファイルで、高速整数型はC++17でも利用可能なので、質問にC++のタグを付けました。 cstdint . 残念ながら、ISO/IEC 14882:2017 (C++17) にはそのような説明のセクションはなく、私は質問の本文でそのセクションを実装しました。


情報です。C言語では、ヘッダーファイルで宣言された stdint.h .

どのように解決するのですか?

64ビットの算術演算のみを行うCPUを想像してください。そのような CPU で符号なし 8 ビット加算をどのように実装するか想像してみてください。正しい結果を得るためには、必然的に複数の演算が必要になります。このようなCPUでは、64ビット演算は他の整数幅の演算よりも高速です。このような場合、すべての Xint_fastY_t はすべて64ビット型の別名であると推定されるかもしれません。

CPU が狭い整数型に対する高速演算をサポートしており、したがって広い型が狭い型より高速でない場合は Xint_fastY_t はすべての Y ビットを表現するのに必要なものより広い型の別名になることはないでしょう(なってはならない)。

好奇心から、私はいくつかのアーキテクチャ上の特定の実装(GNU、Linux)のサイズをチェックしました。これらは、同じアーキテクチャ上のすべての実装で同じではありません。

┌────╥───────────────────────────────────────────────────────────┐
│ Y  ║   sizeof(Xint_fastY_t) * CHAR_BIT                         │
│    ╟────────┬─────┬───────┬─────┬────────┬──────┬────────┬─────┤
│    ║ x86-64 │ x86 │ ARM64 │ ARM │ MIPS64 │ MIPS │ MSP430 │ AVR │
╞════╬════════╪═════╪═══════╪═════╪════════╪══════╪════════╪═════╡
│ 8  ║ 8      │ 8   │ 8     │ 32  │ 8      │ 8    │ 16     │ 8   │
│ 16 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 16     │ 16  │
│ 32 ║ 64     │ 32  │ 64    │ 32  │ 64     │ 32   │ 32     │ 32  │
│ 64 ║ 64     │ 64  │ 64    │ 64  │ 64     │ 64   │ 64     │ 64  │
└────╨────────┴─────┴───────┴─────┴────────┴──────┴────────┴─────┘


より大きな型に対する操作はより速いかもしれませんが、そのような型はキャッシュでより多くのスペースを取るので、それらを使用することが必ずしも良いパフォーマンスをもたらすとは限らないことに注意してください。さらに、実装が最初の段階で正しい選択をしているかどうかは、常に信頼できるものではありません。いつものように、最適な結果を得るためには測定が必要です。


表のスクリーンショット(Androidユーザー向け)。

(Androidはmonoフォントで箱描きの文字がない -。 ref )