2013-05-07 9 views
5

私は、int64/uint64のように、intuintが64ビット符号付き/符号なし整数であることを理解しています。また、intは、int64byte - >uint8など)のエイリアスではないため、int64は適用可能な場合はintに変換する必要があります。しかし、他のものを使用する利点は何ですか?一般的な型を使用すると実行時のパフォーマンス上のペナルティはありますか?Go langの特定の型(int64/uint64)に対する一般的な型(int/uint)の利点は何ですか?

申し訳ありませんが、これはよくある質問です。私は他の人が前に切り取ったかもしれないと思っていたと思いますが、私はグーグルで答えました(そしてここでも検索しました)。パフォーマンス(もしあれば)、メモリ使用量(64ビット整数ではないと思っていますか?)、そしてコンパイラがそれらをどのように扱うかには影響します。

編集:私は、int/unitが32ビットアーキテクチャ上で32ビットであることを認識しています。簡潔さと同様のもののように比較するために、私はこれが64ビットのGolang環境であると仮定していました。

+1

パフォーマンスとメモリの使用は、意見の問題ではありません。 – Laurence

+1

この質問には、単なる意見に基づいていない十分に正確な答えが存在します。質問を再開するために投票してください。 –

答えて

13

intおよびuintは、64ビットアーキテクチャでは64ビットのみです。 32ビットアーキテクチャでは32ビットです。

一般的な答えは、特定の精度が必要な場合を除き、現在のアーキテクチャ上のワードと同じサイズのデータ​​型(32ビットアーキテクチャでは32ビットなど)を使用するほうが、通常はわずかに効率的です。

+0

「わずかに」は、エキソガジェレーションの反対です。 32ビットマシンで64ビットタイプを使用すると、通常、32ビットのものよりも少なくとも2倍の時間がかかります。 – fuz

+0

私はintが32bitシステム上で32bitであることを知っていました(申し訳ありませんが、私はオリジナルの投稿でそれを明確にしておくべきでした。したがって、64ビットシステムでintとint64をどのように処理するかに違いはありません。 – Laurence

+3

@LaurenceMorgan:あなたのコードがコンパイルされると、 'uint'と' uint64'(64ビットアーチを想定)に違いはありません。 2つの間の変換は無料です。言語のみが区別されます。 –

4

"ネイティブ"サイズのスライスと配列インデックスのintに加えて、int型でint型ではありません。

5

intおよびuintは、Go実装および実行時の基本的なGoデータ構造の可能な最大長に対応します。 stringmap[K]T[]Tchan Tの長さは常にintに収まる、と[]Tchan Tの容量は常にintに収まります。

makeによる割り当ては、長さと容量が常にintに収まるオブジェクトを返すようにバインドされています。組み込み関数appendは、長さと容量が決してintを超えないスライスを返します。新しいキーと値のペアを挿入した後のマップの長さ(定義されたキーの数)は、常にintに収まります。

主な利点は、intuintは、スライスやマップなどの一般的な移動データ型に関連して移動プログラムで使用しても安全である(ビットサイズの点で)最小のデータタイプであるということです。

intのサイズは、ポインタのサイズとは無関係です*T*Tに対応する整数型はuintptrです。理論的にGoの実装では、intint16にマッピングすることができます。多くのGoプログラムは正常に動作しますが、割り当てのサイズを15ビットに制限することはあまりにも制限的なため、実行時のパニックが発生する可能性があります。

64ビットアーキテクチャの場合は、1になります。0は、intおよびuint32ビット長であり、Go1.1は64ビット長である(Go 1.1 Release Notes参照)。この変更により、64ビットアーキテクチャ上の一部のGoプログラムのメモリ使用量が増加します。intint64

  • の性能との間の変換の

    • :明示ためゴー1.0下、32ビットアーキテクチャ上で、それが遅くすることができる移動プログラムでint64代わりにintを用い

      除算などの特定のCPU命令は、オペランドのサイズに依存します。

    コンパイラはアドレスのためのより効率的なコードを生成し、すべてのオペランドがある場合は、計算を相殺することができます

    • 64:ので

      は、明示的に囲碁プログラムでint64の代わりintを使用すると、64ビットアーキテクチャ上でゴー1.0の下で、それはより速く行うことができますビット。アドレスとオフセットを計算する際に32ビットオペランドと64ビットオペランドを混合するのが遅くなります。

    [1<<16]Tにアクセスする際にインデックスとしてuint16を使用すると、コンパイラはバインドされたチェック命令を削除できます。

  • +0

    私は 'uint16'をマップやスライスと一緒に楽に使いました。そのため、' int'と 'uint'がマップやスライスで安全に使える**最小**整数型です。真実の反対。 – jeteon

    関連する問題