1. ホーム
  2. optimization

[解決済み] なぜJava APIはshortやbyteの代わりにintを使うのですか?

2022-05-29 17:34:47

疑問点

なぜJava APIは int を使うのでしょうか? short あるいは byte で十分ではないでしょうか?

例 この例では DAY_OF_WEEK クラスのフィールド Calendar int .

もしその違いがあまりにも小さいのであれば、なぜそれらのデータ型( short , int ) が全く存在しないのですか?

どのように解決するのですか?

すでに指摘されている理由もあります。例えば "...(ほとんど)byte、shortに対するすべての操作は、これらのプリミティブをint"に昇格させます。 . しかし、明らかな次の疑問があります。 なぜ は、これらのタイプが int ?

そこで、一段と深く掘り下げると。その答えは、単純にJava仮想マシン命令セットに関係しているのかもしれません。で要約されているように Java 仮想マシン仕様の表 , すべて 加算、除算などの積分演算は、タイプ int という型と long という型、そして ではなく を使用します。

(余談ですが 小さいタイプ( byteshort ) は、基本的に 配列 . また 配列 のように new byte[1000] のような配列は1000バイトかかります。 new int[1000] のような配列は4000バイトになります)

さて、もちろん、次のように言うこともできます。 "...明らかに次の質問でしょう。 なぜ に対してのみ提供されているのでしょうか。 int (そして long )?" .

理由の1つは、前述のJVM Specに記載されています。

もし各型付けされた命令がJava仮想マシンのランタイムデータ型のすべてをサポートするならば、バイトで表現できるよりも多くの命令が存在することになる

さらに、Java仮想マシンは実際のプロセッサを抽象化したものと考えることができます。そして、専用の 算術論理演算ユニット を導入することは、努力に値しないでしょう。トランジスタを追加する必要がありますが、それでも 1 つのクロック サイクルで 1 つの加算を実行するだけです。JVM が設計されたときの主要なアーキテクチャは 32 ビットで、32 ビットの int . (64ビットの long の値を含む操作は特別なケースとして実装されています)。

(注意: 最後の段落は、可能なベクトル化などを考慮して少し簡略化されていますが、プロセッサ設計のトピックに深く潜ることなく基本的な考えを示すべきです)


編集: 質問からの例に焦点を当てた短い補足ですが、より一般的な意味での補足です。を格納することが有益でないかどうかを尋ねることもできます。 フィールド をより小さい型を使って格納することが有益でないかどうかを問うこともできます。例えば、メモリが節約できると思うかもしれません。 Calendar.DAY_OF_WEEKbyte . しかし、ここでJava Class File Formatの出番です。すべての クラス・ファイルのフィールド は少なくとも 1 つの "スロット" を占有し、そのスロットのサイズは 1 つの int (32ビット)のサイズを持っています。("wide"フィールド。 doublelong は、2つのスロットを占有しています)。ですから、フィールドを明示的に short または byte もメモリを節約しません。