web-dev-qa-db-ja.com

uint_fast32_tとは何ですか?また、通常のintとuint32_tの代わりに使用する必要があるのはなぜですか?

したがって、typedef:edプリミティブデータ型の理由は、低レベル表現を抽象化し、理解しやすくするためです(uint64_t型(8バイト)の代わりにlong long)。

ただし、uint_fast32_tと同じtypedefを持つuint32_tがあります。 「高速」バージョンを使用すると、プログラムが高速になりますか?

97
Amumu
  • intは、プラットフォームによっては16ビット程度に小さい場合があります。アプリケーションには十分でない場合があります。
  • uint32_tは存在することが保証されていません。オプションのtypedefは、正確に32ビットの符号なし整数型がある場合にのみ実装が提供する必要があります。たとえば、一部には9ビットのバイトがあるため、uint32_tがありません。
  • uint_fast32_tはあなたの意図を明確に述べています:それは少なくとも32ビットのタイプであり、パフォーマンスの観点からは最適です。 uint_fast32_tは実際には64ビット長です。実装次第です。

... uint_fast32_tと同じtypedefを持つuint32_tがあります...

あなたが見ているのは標準ではありません。これは特定の実装です(BlackBerry)。したがって、そこからuint_fast32_tuint32_tと常に同じであると推測することはできません。

こちらもご覧ください:

116
ybungalobill

違いは、正確さと可用性にあります。

doc は次のとおりです。

幅がexactly8、16、32、64ビットの符号なし整数型(実装が直接提供される場合のみ提供タイプをサポートします):

uint8_t
uint16_t
uint32_t
uint64_t

そして

幅がそれぞれ少なくとも8、16、32、64ビットの最速の符号なし符号なし整数型

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

したがって、uint32_texactly32ビットを持つ型であり、実装がそれを提供する必要があるという違いはかなり明確です。 if ifタイプがexactly 32ビットの場合、そのタイプをuint32_tとしてtypedefできます。つまり、uint32_tavailableである場合とそうでない場合があります。

一方、uint_fast32_tは、少なくとも32ビットの型です。これは、実装がuint32_t as uint_fast32_tifuint32_tを提供します。 uint32_tを提供しない場合、uint_fast32_tは、少なくとも32ビットを持つ任意のタイプのtypedefになる可能性があります。

34
Nawaz

プログラムで#include inttypes.hを実行すると、整数を表すさまざまな方法にアクセスできます。

Uint_fast * _t型は、指定されたビット数を表すための最速の型を単に定義します。

このように考えてください。タイプshortの変数を定義し、プログラムで数回使用します。これは完全に有効です。ただし、作業中のシステムは、int型の値を使用するとより迅速に動作する可能性があります。変数をuint_fast*t型として定義することにより、コンピューターは、動作可能な最も効率的な表現を選択するだけです。

これらの表現に違いがない場合、システムは必要な表現を選択し、一貫して使用します。

2
Harley Sugarman

高速バージョンは32ビットより大きくなる可能性があることに注意してください。 fast intはレジスタにうまく収まり、位置合わせなどが行われますが、より多くのメモリを使用します。これらの配列が大きい場合、メモリキャッシュヒットと帯域幅が増えるため、プログラムは遅くなります。

一般に、32から64ビットの符号拡張はロード命令中に発生する可能性があり、より高速な「ネイティブ」整数形式があるという考えは昔ながらなので、現代のCPUはfast_int32の恩恵を受けないと思います。

0
Gil Colgate