C#(および他の言語)では、数値変数を short
, int
, long
として定義することができます(他の型も同様です)。多くの数学的な演算 (例えば、加算 +
) は整数 (int
) として評価されるので、2つの short
に対して演算する場合でも、結果を short
に格納するために明示的なキャストが必要になります。たとえ数値が short
の記憶容量を超えることがないとしても、単純に int
を使用する方がはるかに簡単です (そして間違いなくより読みやすい)。実際、ほとんどの人は short
で十分な場合でも、 short
カウンタではなく int
カウンタを使用して for
ループを記述していると思われます。
intを使うのは単に将来のためだとも言えますが、
short` が十分な大きさであることがわかっている場合もあります。
このような小さなデータ型を使用することで、必要な追加キャストや可読性の低下を補うような実用的な利点があるのでしょうか?それとも、値が short
の容量を超えないことが確実な場合 (例えば、グラフの軸の数など) でも、どこでも int
を使用する方が実用的なのでしょうか?それとも、より小さなデータ型のスペースやパフォーマンスが絶対に必要な場合にのみ、その利点を享受できるのでしょうか?
重複を避けるために編集しました。
Thisは近いですが、広すぎます - そして、メモリ性能よりもCPU性能について話しています(多くの類似点がありますが)。
この記事も近いですが、私の質問の実用的な側面には到達していません。そうですね、short
を使うのが適切な場合もありますし、この質問はそれを明らかにする良い仕事です。しかし、適切であることが常に実用的であるとは限りませんし、性能の向上が(あったとしても)実際に実現されるとは限りません。
プリミティブタイプを使わなければならないと思ったときについて。
ローカル変数は、一般的に小さいデータ型を使用した場合、同じ速度かわずかに悪い速度で動作します。したがって、これはステートメント — すなわち、 for
, while
や関連するカウンタ & ループ変数、その他のローカル変数、そしてパラメータなどのコンテキストでは、全く意味がありません。 さらに、ポインタと同じサイズのネイティブな int
サイズを使用するようにしなければ、任意のサイズのコレクションを反復処理するときに数値のオーバーフローが発生する危険性があります。
プリミティブのサイズを小さくすることを考えるのは、オブジェクトの量が非常に多いデータ構造においてだけです。 その場合でも、ほとんどの言語では、メモリ割り当て時のアライメントに関係する最小のオブジェクトサイズがあります。 つまり、1つの short
と1つの int
を使うことは、(言語の実装にもよりますが) 何も得られないかもしれません。なぜなら、使われなかったスペースは単にアラインメントに関係するパディングに使われるからです。一方、2つの short
を使うと、short
は一緒にパックできるので 2つの int
よりスペースを節約できる場合があります。