2012-12-22 12 views
5

多分パフォーマンスですか?固定されていない整数を使用すると、別のアーキテクチャに移植するときに、プログラムが複雑になり、失敗する傾向があるように感じます。固定サイズの整数(int64_t、int32_t)の代わりに非固定の整数(int、long)を使用する利点はありますか?

+3

私のコードでは正確なサイズはほとんど問題ではないことがわかりました。そのような場合は、固定長の整数を使用するだけですっきりして、移植性が向上します。あなたはビットサイズを知る必要がありますか? – delnan

+1

私はそれがあなたがしたいと思う仮定になると思います。特定の値が常にアーキテクチャの正確なビット数を持つと仮定したいですか?もしそうなら、固定サイズの整数が正しい選択かもしれません。そうでなければ、特定の最小ビット数を保証するタイプを使用したいかもしれません。 –

答えて

5

std::intN_tonly if the implementation can directly support themを提供しています。したがって、それらを使用する移植コードは失敗する可能性があります。

制限が少なく、intと同じかそれ以上の速さでなければならないので、私は一般的にはstd::intfastN_tを好むでしょう。 intを受け入れる関数にstd::int32_tを渡すときあなたはsizeof(int)は16ビットのみである場合は特に、プロモーションおかしなに遭遇するかもしれないので

はまた、ほとんどのC++コードはどこにでもintを使用しています。

+0

uint_fast8_tはuint8_tのように振る舞いますか? 255 + 1 = 0? – lamefun

+0

@ lamefun No.それは少なくとも255、おそらくより多くを保持することができます。保証されたサイズが必要な場合は、 'uint8_t'を使用してください(ほとんどの用途ではまれです)。 – Pubby

0

多くのAPIは、非固定型の値を受け入れたり返したりします。例えば、ファイル記述子がタイプint、ファイルオフセットやサイズであるタイプoff_tstrtol()longを返すのです。このような値を固定サイズのタイプから盲目的に変換すると、一部のマシンでオーバーフローが発生する可能性があります。

0

保証幅タイプ(intN_t)は、単に適切な「標準」、整数タイプに型定義されています。プラットフォームが適切なタイプ(例えば、36ビットの整数を使用する)を持たない場合、保証されたタイプのtypedefを提供することはできません。 これは、パフォーマンスがほとんど引数になり得ないことを意味します。

(この点で)最大の移植のための一般的なガイドラインは、あなたのアルゴリズムは、ビットの正確な数を要求する場合にのみ、デフォルトで「標準」整数型と保証幅のタイプを使用することです。 標準の整数型は、関連する規格で保証されているものと同じ幅であることが前提です(8ビットのchar、16ビットのint、32ビットのlong、コンパイラがサポートしている場合は、64ビットのlong long)。

0

あなたがあなたのタイプのサイズは、それが機能だために重要であるデータを持っている場合は、あなたが定義したサイズと種類を使用する必要があります。しかし、例えば、あなたが合理的に期待できるint範囲(例えば、1〜1000ループカウンタ)内にあるコードの場合、int_32tを使用する理由はありません。それは16,32,64,36,18、または49ビットの整数ですべて正常に動作します。コンパイラに最適なサイズを選択させてください。

コンパイラがアーキテクチャにとって「最適な選択」ではない固定サイズの整数に対してコードを悪化させる可能性があります。

もちろん、ネットワーク上またはファイルに提示されているすべてのデータは、固定サイズを持っている必要があります。同様に、インタフェース境界を越えてバイナリ互換性が必要なインタフェースを持つ場合、定義されたサイズの型を使用することは、サイズが問題になるのを避けるために非常に便利です。

関連する問題