12

重複の可能性:
16 ビット整数を使用することの重要性

今日のプロセッサが (標準条件下で) 32 ビット操作を実行する場合、「short int」の使用は合理的ですか? そのデータに対して操作を実行するために、(16 ビットから) 32 ビットの整数に変換し、操作を実行してから、16 ビットに戻すためです。では、ポイントは何ですか?

本質的に、私の質問は次のとおりです。

  1. より小さな範囲の整数を使用すると、どのようなパフォーマンスの向上/障害がもたらされますか? 同様に、ストレージに標準の 32 ビット整数を使用する代わりに、16 ビットの短整数を使用します。
  2. 「その後、16 ビットに戻る」 -- ここで正しいですか? 上記を参照。
  3. すべての整数データは、CPU/RAM 上の 32 ビット整数空間として格納されていますか?
4

5 に答える 5

5

最初の質問への回答は、最後の質問も明確にする必要があります。大量の 16 ビットs を格納する必要がある場合、32 ビットs にint必要なメモリ量の半分を節約できます。intたとえば、キャッシュをより効率的に使用するなどです。

最近のほとんどの CPU には、メモリとの間で 16 ビット値を読み書きするための命令とともに、16 ビットと 32 ビットの操作用に別々の命令があります。内部的に、ALU は 32 ビット演算を実行している可能性がありますが、上位半分の結果はレジスタに戻されません。

于 2012-12-20T03:05:49.950 に答える
4
  1. プロセッサは、それを操作するために値を「拡張」する必要はありません。未使用のスペースをゼロで埋め、計算を実行するときにそれらを無視します。したがって、実際には、short intよりも動作する方が高速long intですが、今日の高速CPUでは、少しでも違いに気付くのは非常に困難です(しゃれが意図されています)。

  2. マシンは実際には変換されません。値のサイズを変更すると、左側にゼロが埋め込まれるか、ターゲットメモリ領域に収まらない左側の余分なビットが完全に無視されます。

  3. いいえ。これが通常、ジャストshort intの範囲が必要ない目的で値を使用する理由です。割り当てられるメモリは、のlong int長さごとに異なります。たとえば、が使用するメモリのビット数は。よりも少なくなります。最適化の手順の1つは、範囲がの範囲を超えない場合に値を値に変更することです。つまり、値は、で割り当てられた余分なビットを使用しません。このような最適化によって節約されたメモリは、配列内の多数の要素、または同じまたはの多数のオブジェクトを処理する場合、実際には非常に重要になる可能性があります。intshort intlong intlong intshort intshort intlong intstructclass

さまざまintなサイズが、RAMと内部プロセッサキャッシュの両方にさまざまなビット量で格納されます。これは、、、およびにも当てはまりますがfloat、主に64ビットシステム用であり、ほとんどのコンパイラは、32ビットアキュムレータおよびALUの64ビット値が「削除」されるため、32ビットマシンで実行されている場合は無視します。計算中は、最初の32ビットでゼロ以外のものを受け取ることはないでしょう。doublelong doublelong doublelong

于 2012-12-20T03:23:01.200 に答える
3

より小さな範囲の整数を使用すると、どのようなパフォーマンスの向上/障害がもたらされますか? 同様に、ストレージに標準の 32 ビット整数を使用する代わりに、16 ビットの短整数を使用します。

メモリ使用量が少なくなります。通常の状況では、使用量は半分になります。

「その後、16 ビットに戻る」 -- ここで正しいですか? 上記を参照。

コードで必要な場合にのみ、16ビットと32ビットの間で変換しますが、表示できませんでした。

すべての整数データは、CPU/RAM 上の 32 ビット整数空間として格納されていますか?

いいえ。32 ビット プロセッサは、最大32 ビットの値をアドレス指定して直接操作できます。多くの操作は、8 ビット値と 16 ビット値でも実行できます。

于 2012-12-20T03:10:25.127 に答える
3

使用する必要のある(非常に厳しい)メモリ制約がない限り、いいえは合理的ではありませんint

  1. メモリだけで、パフォーマンスは向上しません。実際、レジスタは上位ビットを取り除く必要があるため、今言ったことのためにパフォーマンスが低下します。
  2. 上記を参照
  3. はい、CPU によって異なります。いいえ、RAM では 16 ビットです。
于 2012-12-20T03:15:17.530 に答える
1

より小さな範囲の整数を使用すると、どのようなパフォーマンスの向上/障害がもたらされますか? 同様に、ストレージに標準の 32 ビット整数を使用する代わりに、16 ビットの短整数を使用します。

パフォーマンスは、キャッシュの局所性によってもたらされます。キャッシュに収まるデータが多いほど、プログラムの実行速度が速くなります。short多くの値がある場合、これはより関連性があります。

「その後、16 ビットに戻る」 -- ここで正しいですか?

これについてはよくわかりません。CPU は複数の操作を並行して最適化できると予想していましたが、データを 16 ビットにパックできればスループットが向上します。これは、他の 32 ビット操作と同時に発生する可能性もあります。ここは憶測なのでやめておきます!

すべての整数データは、CPU/RAM 上の 32 ビット整数空間として格納されていますか?

いいえ。さまざまな整数データ型には特定のサイズがあります。charただし、特にandを使用すると、構造体内にパディングが発生する場合がありますshort


速度効率だけが問題ではありません。明らかに、ストレージの利点と固有の動作があります (たとえば、unsigned shortモジュロを実行する必要がないように、 a の整数オーバーフローを悪用するパフォーマンス固有のコードを作成しました)。また、バイナリ データの読み取りと書き込みに特定のデータ サイズを使用できるという利点もあります。私が言及していないことはおそらくもっとあるでしょうが、要点はわかります=)

于 2012-12-20T03:27:17.763 に答える