2012-07-27 19 views
6

C++では、long over intを使用することに利点はありますか?C++のintとlongの比較

x86とx86_64アーキテクチャ(x86では32ビット、x86_64では64ビット、intは32ビットです)のデフォルトのワードサイズは長いようですが、これは理論的には算術演算を高速化する必要があります。

C++標準では、sizeof(int)< = sizeof(long)が保証されていますが、32ビットシステムと64ビットシステムではデフォルトサイズが長いようですので、両方のアーキテクチャで移植可能なコードを作成しようとしていますか?

+1

Windowsでは、「long」は32ビットです。 Linuxでは、 'long 'は64ビットです。それは多くのアプリケーションを破壊します。 – Mysticial

+0

関連:[C++のintとaとlongとの違いは何ですか?](http://stackoverflow.com/q/271076/11343) – CharlesB

答えて

1

何が速く、何かが毎日を予測するのが難しくなっているものではありません。その理由は、プロセッサはもはや「シンプル」ではなく、それらの背後にある複雑なダイナミクスやアルゴリズムでは、最終的なスピードは全く直感的ではないルールに従うことがあるからです。

唯一の方法は、測定して決定することです。また、より速いものは小さな詳細に依存し、互換性のあるCPUであっても、最適化されたものはもう一方のための悲観化となり得ることに注意してください。非常に重要な部分については、ソフトウェアによっては、プログラムの初期化中に実行時に異なる手法のタイミングを試してみるだけです。

言い換えれば、一般的なルールとして、より高速な整数はintです。他の整数は、具体的に必要な場合のみ使用してください(たとえば、longがより大きく、より高い精度が必要な場合、またはshortが小さくても十分で、メモリを節約する必要がある場合など)。

特定のサイズが必要な場合は、固定標準タイプを使用するか、typedefを追加して、必要な場所にほんの約longを振ってください。このようにすれば、異なるコンパイラやアーキテクチャをサポートすることがより簡単になり、将来コードを読む人にとってはより明確になります。

5

longは少なくとも32ビットであることが保証され、一方、intは少なくとも16ビットであることが保証される。完全移植可能なプログラムを書くときは、intの保証サイズがあなたのニーズに十分でないところでlongを使用することができます。

しかし実際には、intがそのようなプラットフォームをターゲットにしているため、標準保証よりも大きいという暗黙の前提があります。このような状況では、通常はそれほど重要ではありません。

intは、システムの番号の「自然な」サイズである必要があります。理論的にはlongはより高価かもしれませんが、多くのアーキテクチャではlongの操作はlongが実際にはintより長い場合でも高価になりません。

4

異なるプラットフォーム間で同じサイズの整数型が必要な場合は、タイプを<stdint.h>にします。

例えば、32ビットの符号なし整数が絶対に必要な場合は、uint32_tが必要です。 64ビット符号付き整数が絶対に必要な場合は、int64_tが必要です。

+0

しかし、できるだけ控えめに 'xintX_t'型を使用してください。コードがあまり寛容でないCPUアーキテクチャに移植された場合、これらはパフォーマンスに深刻な影響を与えます。 – wallyk

+0

@wallyk:当然のことではなくなっている型のサイズについての前提のため、コードはバグが多いので、バグのあるコードに対してパフォーマンス上の犠牲を強いられることになります(もちろん、コードはサイズについてもっと仮定するべきではありません標準の保証されているものは何種類かありますが、それでもまだ頻繁に起こります) – Grizzly