2つの違いは何ですか?int32_t は環境に関係なく正確に 32 ビットであることは知っていますが、その名前が示すように高速であることを示していますが、実際に int_fast32_t は int32_t と比較してどれくらい高速ですか? そして、それが大幅に高速である場合、なぜそうなるのでしょうか?
2 に答える
C は、理想化された抽象的なマシンの観点から指定されています。しかし、実際のハードウェアには、言語標準では捉えられない動作特性があります。型は、_fast
各プラットフォームがハードウェアにとって「便利な」型を指定できるようにする型エイリアスです。
たとえば、8 ビット整数の配列があり、それぞれを個別に変更したい場合、これは現代のデスクトップ マシンではかなり非効率的です。なぜなら、それらのロード操作は通常、32 または 64 のいずれかであるプロセッサ レジスタ全体を埋めたいからです。ビット幅 (「機械語」)。そのため、ロードされた大量のデータが無駄になり、さらに重要なことに、隣接する 2 つの配列要素のロードと格納を並列化することはできません。これは、それらが同じマシン ワード内にあり、ロード、変更、格納を順番に行う必要があるためです。
_fast
可能であれば、タイプは通常、機械語と同じくらい広いです。つまり、それらは必要以上に広く、より多くのメモリを消費する可能性があります (そのため、キャッシュが難しくなります!) が、ハードウェアはより高速にアクセスできる可能性があります。ただし、それはすべて使用パターンに依存します。(たとえば、の配列int_fast8_t
はおそらく機械語の配列であり、そのような配列を変更するタイトなループは、かなりの利益をもたらす可能性があります。)
違いがあるかどうかを確認する唯一の方法は、比較することです。
int32_t
正確に 32 ビットの整数です。たとえば、正確なメモリ配置で構造体を作成したい場合に便利です。
int_fast32_t
は、現在のプロセッサの「最速」の整数であり、最終的にint32_t
. 現在のプロセッサ (x86 または ARM) に本当に利点があるかどうかはわかりません。
しかし、ようやく実際のケースの概要を説明できます。以前は 32 ビットの PowerPC プロセッサで作業していました。ミスアラインint16_t
された 16 ビットにアクセスする場合、最初に 32 ビット レジスタの 1 つでそれらを再アラインする必要があるため、非効率的でした。メモリ マップされていないデータの場合、メモリの制限がなかったため、より効率的に使用できint_fast16_t
ました (実際には 32 ビットの int でした)。