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


109

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

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


long longは8バイトではない可能性があります。1バイト(CHAR_BITが少なくとも64の場合)または3738383バイトのlong longにすることができます。また、uint64_tは1、2、4、または8バイトにすることができ、そのためにはCHAR_BITが64、3、16、または8である必要があります。
12431234123412341234123 2016

回答:


134
  • 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

以下も参照してください。


35
いい答えだ。完全を期すために、違いを指摘することuint_least32_tもできます。これは、uint_fast32_t速度よりも小さなストアを優先することを除いて同じです。
デイモン

2
幅が32ビット以上の最も速い整数が32ビットよりも大きくなるのはなぜですか?ビットが少ないと、CPUが処理する必要のあるビットが少なくなり、高速になるといつも思っていました。ここで何が欠けていますか?
シェーンスー2013

12
@ShaneHsu:64ビットCPUには64ビットビットサマーがあり、64ビットの数値を1サイクルで合計するとします。32ビットの数値を処理するだけでよい場合は、1サイクルよりも速くなることはありません。現在、x86 / amd64ではそうではありませんが、32ビット整数はアドレス指定できない場合もあります。このような場合、それらを処理するには、たとえば64ビット境界のユニットから32ビットを抽出するための追加の操作が必要です。リンクされた質問も参照してください。C ++標準は、37ビットワードのマシンで動作するように記述されています。したがって、32ビットタイプはまったくありません。
Yakov Galka 2013

42

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

ここのドキュメントは言う:

幅の符号なし整数型を正確に(それぞれ、8、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を持つ型であるという違いはかなり明確であり、実装は、正確に 32ビットの型を持つ場合のみ提供する必要があり、その型をとしてtypedefできます。つまり、利用できる場合とできない場合があります。 32uint32_tuint32_t

一方、uint_fast32_t有するタイプである少なくとも実装がtypedefでよい場合も手段、32ビット、uint32_tのようuint_fast32_t ならば、それが提供しますuint32_t。それは提供していない場合uint32_t、その後uint_fast32_t少なくとも有する任意の型のtypedefであり得る32ビット。


3
しかし、たとえばuint_fast32_tがuint32_tよりも高速になる理由は何ですか?なぜそれが速いのですか?
デストラクタ

2
@PravasiMeet:すべての整数が同じ方法でアクセスされるわけではありません。いくつかは他より簡単にアクセスできます。簡単とは、計算量が少なく、より直接的であることを意味し、より高速なアクセスが可能になります。現在uint32_t、すべてのシステムで正確に32ビットです(存在する場合)。これは、たとえば64ビットのシステムと比べて高速ではない可能性があります。 uint_fast32_t一方、少なくとも 32ビット、64ビットの場合もあります。
Nawaz

10
@Destructor:一部のプロセッサでは、変数がより長いレジスタに格納される場合、コンパイラが余分なビットを取り除くために追加のコードを追加する必要がある場合があります。たとえばuint16_t x;、ARM7-TDMIの32ビットレジスタに格納されている場合、コードをx++;として評価する必要がありx=((x+1)<<16)>>16);ます。そのプラットフォームのコンパイラでは、それを回避するためにuint_fast16_tと同意語として定義される可能性が最も高いでしょうuint32_t
スーパーキャット2016年

なぜ[u]int_(fast|least)N_tオプションでもないのですか?確かに、64ビットのプリミティブ型をサポートするために、すべてのアーキテクチャが標準で必要なわけではありませんか?しかし、の表現はstdint.h、そうしなければならないことを意味しています。私が奇妙に思えるのは、64ビットコンピューティングが主流になる数年前の1999年以来、エンベデッドアーキテクチャの(多くの場合、現在も)最新の遅れは言うまでもありません。これは私にとって大きな見落としのようです。
underscore_d

1
@underscore_d:たとえば、標準が16バイトのデータRAMと256命令用のスペースを備えたPIC12実装に適用できないという特別な理由はありません。このような実装では多くのプログラムを拒否する必要がありますが、それでも、ニーズを満たすことができるプログラムに対して定義された動作を妨げることはありません。
スーパーキャット2018

4

あなたが #include inttypes.hあなたのプログラムの中で、あなたは整数を表現するためのさまざまな方法の束へのアクセスを取得します。

uint_fast * _t型は、特定のビット数を表すための最高速の型を単純に定義します。

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

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


9
stdint.hではなくinttypes.hを使用する理由 inttypes.hには、軽度に役立つさまざまな綿毛とstdint.hのインクルードのみが含まれているようです。
ランディン

@underscore_d私は違いを知っています。しかし、アプリケーションの領域に関係なく、プロのプログラムでstdio.hを使用するのは誰ですか?
ランディン

@Lundin彼らが誰であるか、またはそれらが存在するかどうかはわかりません!その「やや有用な綿毛」が何であるかを詳しく説明しているリンクを提供することは有用かもしれないと私は思っただけです;-)おそらくそれは人々があなたが正しいことを理解し、彼らがそれを必要としないことを助けるでしょう。
underscore_d

-1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.