18

2つの違いは何ですか?int32_t は環境に関係なく正確に 32 ビットであることは知っていますが、その名前が示すように高速であることを示していますが、実際に int_fast32_t は int32_t と比較してどれくらい高速ですか? そして、それが大幅に高速である場合、なぜそうなるのでしょうか?

4

2 に答える 2

27

C は、理想化された抽象的なマシンの観点から指定されています。しかし、実際のハードウェアには、言語標準では捉えられない動作特性があります。型は、_fast各プラットフォームがハードウェアにとって「便利な」型を指定できるようにする型エイリアスです。

たとえば、8 ビット整数の配列があり、それぞれを個別に変更したい場合、これは現代のデスクトップ マシンではかなり非効率的です。なぜなら、それらのロード操作は通常、32 または 64 のいずれかであるプロセッサ レジスタ全体を埋めたいからです。ビット幅 (「機械語」)。そのため、ロードされた大量のデータが無駄になり、さらに重要なことに、隣接する 2 つの配列要素のロードと格納を並列化することはできません。これは、それらが同じマシン ワード内にあり、ロード、変更、格納を順番に行う必要があるためです。

_fast可能であれば、タイプは通常、機械語と同じくらい広いです。つまり、それらは必要以上に広く、より多くのメモリを消費する可能性があります (そのため、キャッシュが難しくなります!) が、ハードウェアはより高速にアクセスできる可能性があります。ただし、それはすべて使用パターンに依存します。(たとえば、の配列int_fast8_tはおそらく機械語の配列であり、そのような配列を変更するタイトなループは、かなりの利益をもたらす可能性があります。)

違いがあるかどうかを確認する唯一の方法は、比較することです。

于 2013-04-23T08:09:22.630 に答える
9

int32_t正確に 32 ビットの整数です。たとえば、正確なメモリ配置で構造体を作成したい場合に便利です。

int_fast32_tは、現在のプロセッサの「最速」の整数であり、最終的にint32_t. 現在のプロセッサ (x86 または ARM) に本当に利点があるかどうかはわかりません。

しかし、ようやく実際のケースの概要を説明できます。以前は 32 ビットの PowerPC プロセッサで作業していました。ミスアラインint16_tされた 16 ビットにアクセスする場合、最初に 32 ビット レジスタの 1 つでそれらを再アラインする必要があるため、非効率的でした。メモリ マップされていないデータの場合、メモリの制限がなかったため、より効率的に使用できint_fast16_tました (実際には 32 ビットの int でした)。

于 2013-04-23T08:11:36.063 に答える