16

ループがx回を超えて実行されないことを知っている場合がよくあります。この場合、xはバイトまたはshort(基本的にはintよりも小さいデータ型)で表すことができます。

バイトのようなもので8ビットだけで十分なのに、なぜ32ビット(ほとんどの言語で)を使用するintを使用するのでしょうか。

32ビットと64ビットのプロセスがあるので、1回のトリップで値を簡単にフェッチできますが、それでもより多くのメモリを消費します。または私はここで何が欠けていますか?

更新:明確にするために。速度に関しては違いがないことを私は知っています。メモリ消費への影響について質問しています。

4

6 に答える 6

27

C では、現在のマシンで最も効率的な整数型として "int" が定義されています。

通常、CPUのレジスタと一致します。これが最も効率的です。

より小さいタイプの整数値を使用すると、CPU レベルでビットシフトまたはビットマスキングが発生する可能性があるため、ゲインが得られません...

于 2010-11-17T13:36:15.697 に答える
8

ネイティブワードサイズと同じサイズの整数サイズにアクセスするのが最も効率的です。バイトを使用すると、ほぼ確実にネイティブワードサイズと同じスペースが必要になり、アクセスするにはシフトとマスキングが必要になるため、何も得られません。

実際には、非常に大きなループまたは厳しいタイミング制限がない限り、大きな違いはありません。

しかし、いつものように、最も読みやすいものを使用し、ベンチマーク/プロファイルを最初に...

于 2010-11-17T13:35:43.783 に答える
7

int誰もがいつも使っているという理由だけで、よほどの理由がない限り、私はほとんどいつも使っています。これは、次の開発者がなぜここで を使用しなかったのintか、私が知る必要がある特別な理由があるのか​​ を考えるのに時間を費やすのを避けるためです。

私のコードがより標準的であるほど、将来読みやすくなります。

于 2010-11-17T13:36:49.897 に答える
6

多くの場合、ループカウンタは正確に1つのプロセッサレジスタを消費します。タイプを8ビットまたは16ビット整数に変更しても、レジスタのサイズは固定されているため(32ビットプラットフォームでは32ビットなど)、変更されません。

ループから関数を呼び出す場合など、ループカウンターがRAMに配置されることがあります。そうすると、はい、数バイトを無駄にしている可能性がありますが、一般的に心配するほどではありません。とは異なるものを使用すると、ループカウンターの保存と読み込みが実際に遅くなる可能性がありますint

于 2010-11-17T13:35:33.577 に答える
4

Java 言語仕様に関しては、 と の使用について注目すべき興味深い点がlongありdoubleます。

Java プログラミング言語のメモリ モデルの目的上、不揮発性の long または double 値への 1 回の書き込みは、2 つの個別の書き込み (32 ビットの半分ごとに 1 回) として扱われます。これにより、スレッドが 1 つの書き込みから 64 ビット値の最初の 32 ビットを参照し、別の書き込みから 2 番目の 32 ビットを参照する状況が発生する可能性があります。volatile long 値と double 値の書き込みと読み取りは、常にアトミックです。参照への書き込みと参照の読み取りは、それらが 32 または 64 ビット値として実装されているかどうかに関係なく、常にアトミックです。VM の実装者は、可能な限り 64 ビット値を分割しないようにすることをお勧めします。プログラマーは、共有 64 ビット値を volatile として宣言するか、プログラムを正しく同期して複雑化を回避することをお勧めします。

明らかにこれにより、ループ変数でlongorを使用すると、Java メモリ モデルでのdoubleよりも効率が低下しますが、実装によってパフォーマンスが異なる場合があります。int

于 2010-11-17T13:55:02.983 に答える