12

intがメモリ内で 4 バイトを使用することを考慮してください。

私が探しているものを理解するには、この例を見てください:

for(x=0;x<10;x++) //do something

この命令では、 xの値が11未満であることを知っています。

私は多くのコードを見てきましたが、ほとんどの人はxをintのように宣言しています。

なぜそうすべきでないのか、なぜほとんどの人がxをshortcharのように宣言しないのか!!

その理由を考えたところ、たとえば次のような説明が見つかりました。

short s=5;

sはメモリ内で 2 バイトを使用します。私が知っているのは、コンパイラが 5 を int のように見なすため 5 を s に配置するには 5short right変換する必要があるということです!!

-> したがって、この命令はメモリ消費量が少なくなりますが、より多くの作業が必要になります

int i=5;

ここでは 4バイトを取りますが、会話は必要ありません ( 5intです)

-> したがって、この命令は作業が少なくなりますが、より多くのメモリが必要になります

私が思ったような理由です!!

私の質問が明確だったことを願っています

4

7 に答える 7

16

何百万もの数値をメモリに格納する必要があり、各数値が 0 から 11 の間である可能性がある場合は、メモリが心配になります。ループでは、変数は CPU レジスタに保存される可能性が最も高く、たとえば、x86 では 32 ビット、x86_64 では 32 ~ 64 ビットなどです。すべての「小さい」整数は 32 にゼロ拡張されます。とにかく64ビット。

intシンプルで読みやすいので、多くの人が利用しています。ただし、パフォーマンスを心配したり、サイズの制約についてコンパイラにヒントを与えたりする必要がある場合は、「(u)int_fast_*」型 (つまりuint_fast8_t.

于 2013-06-18T16:02:25.417 に答える
9

あなたは物事の表面的な見た目について考えすぎています。現実はそれとは異なります。

たとえば、ループ変数が使用するメモリが心配だとします。ただし、多くのループでは、ループ変数がメモリに格納されることはありません。代わりに、レジスターに保持されます。CPU 内のレジスタの数は限られていますが、変数はレジスタの半分を占めることはできません (通常、x86 では少し奇妙です)。そのため、int、short、または char のいずれを使用しても、おそらく完全なレジスタを失うことになります。したがって、変数を小さくしても何も節約されません。

同様に、整数リテラルを short に割り当てると、int よりも多くの作業が必要になるという仮定があります。ここで問題となるのは、コンパイラが実行時に何らかの変換を行うコードを生成するという仮定です。そもそも、単純なことを行うコードを生成する方がはるかに簡単です (リテラルをメモリの場所に格納するだけです)。

于 2013-06-18T16:01:03.390 に答える
8

すべての最大の理由 - 読みやすさ。ループが ashortまたは acharを反復しているのを見たら、その理由を理解するために少し時間を費やします。Anintは、反復に最もよく使用される型であるため、より直感的です (さらにiteratororが使用されますsize_t)。

于 2013-06-18T15:57:46.880 に答える
5

よりも小さい算術型を選択して、メモリ使用量をマイクロ最適化することが理にかなっている場合がありますint。しかし、それには代償が伴います。正式には、値が昇格さintれて算術演算が行われ、その後、より小さな型に変換されるためです。intはターゲット プラットフォームの自然なサイズです。したがって、特に将来のすべてのメンテナは、だれかがそのような不自然なコードを書いた理由を理解する必要があるため、ほとんどの場合、そのまま使用することをお勧めします。

于 2013-06-18T15:59:36.850 に答える
4

「プレーンな int は、実行環境のアーキテクチャによって提案された自然なサイズを持っています」1。これは、典型的なケースでは、プレーンな int が、操作および操作するプロセッサに最小限の作業を課すタイプであることを意味します。要するに、int他の何かを使用する十分な理由がない場合に通常使用するデフォルトのタイプです。

shortまた、引用されたケースで aまたは aを使用することによるメモリ使用量の削減は、char完全に幻想である可能性があることに注意してください。典型的なケースでは、いずれにせよループ インデックス変数がレジスタに割り当てられることを期待できます。そのため、気にするビット数に関係なく、変数は本質的にレジスタ全体を占有します。レジスターにない場合、通常はスタック上にあり、ほとんどの場合、スタック上の項目のサイズも固定されています (32 ビット アーキテクチャでは 32 ビット、64 ビット アーキテクチャでは 64 ビットなど)。 .) したがって、単一のchar(たとえば) を割り当てると、多くの場合、intいずれにせよ と同じくらい多くのメモリが使用される可能性があります。


  1. n1337 の §3.9.1/2 ですが、元の ANSI C89 標準にまでさかのぼる C および C++ のすべての標準は、セクション番号が変更されていますが、実質的に同一の言い回しを持っています。
于 2013-06-18T16:17:20.203 に答える
1

いいえ、完全ではありません。ある程度妥当なコンパイラを使用している場合、これは正しく処理されます。メモリ使用量が気になる場合は short を使用し、そのままにしておきます。

intただし、通常はレジスタのサイズであるため、おそらくより良いでしょう。これは、一部の CPU アーキテクチャではより効率的です。

この質問も参照してください。

于 2013-06-18T15:58:09.900 に答える