したがって、typedef
:edプリミティブデータ型の理由は、低レベル表現を抽象化し、理解しやすくするためです(uint64_t
型(8バイト)の代わりにlong long
)。
ただし、uint_fast32_t
と同じtypedef
を持つuint32_t
があります。 「高速」バージョンを使用すると、プログラムが高速になりますか?
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_t
がuint32_t
と常に同じであると推測することはできません。
こちらもご覧ください:
違いは、正確さと可用性にあります。
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_t
がexactly32
ビットを持つ型であり、実装がそれを提供する必要があるという違いはかなり明確です。 if ifタイプがexactly 32ビットの場合、そのタイプをuint32_t
としてtypedefできます。つまり、uint32_t
はavailableである場合とそうでない場合があります。
一方、uint_fast32_t
は、少なくとも32ビットの型です。これは、実装がuint32_t
as uint_fast32_t
ifuint32_t
を提供します。 uint32_t
を提供しない場合、uint_fast32_t
は、少なくとも32
ビットを持つ任意のタイプのtypedefになる可能性があります。
プログラムで#include inttypes.h
を実行すると、整数を表すさまざまな方法にアクセスできます。
Uint_fast * _t型は、指定されたビット数を表すための最速の型を単に定義します。
このように考えてください。タイプshort
の変数を定義し、プログラムで数回使用します。これは完全に有効です。ただし、作業中のシステムは、int
型の値を使用するとより迅速に動作する可能性があります。変数をuint_fast*t
型として定義することにより、コンピューターは、動作可能な最も効率的な表現を選択するだけです。
これらの表現に違いがない場合、システムは必要な表現を選択し、一貫して使用します。
高速バージョンは32ビットより大きくなる可能性があることに注意してください。 fast intはレジスタにうまく収まり、位置合わせなどが行われますが、より多くのメモリを使用します。これらの配列が大きい場合、メモリキャッシュヒットと帯域幅が増えるため、プログラムは遅くなります。
一般に、32から64ビットの符号拡張はロード命令中に発生する可能性があり、より高速な「ネイティブ」整数形式があるという考えは昔ながらなので、現代のCPUはfast_int32の恩恵を受けないと思います。