[解決済み] なぜJava APIはshortやbyteの代わりにintを使うのですか?
疑問点
なぜJava APIは
int
を使うのでしょうか?
short
あるいは
byte
で十分ではないでしょうか?
例 この例では
DAY_OF_WEEK
クラスのフィールド
Calendar
は
int
.
もしその違いがあまりにも小さいのであれば、なぜそれらのデータ型(
short
,
int
) が全く存在しないのですか?
どのように解決するのですか?
すでに指摘されている理由もあります。例えば
"...(ほとんど)byte、shortに対するすべての操作は、これらのプリミティブをint"に昇格させます。
. しかし、明らかな次の疑問があります。
なぜ
は、これらのタイプが
int
?
そこで、一段と深く掘り下げると。その答えは、単純にJava仮想マシン命令セットに関係しているのかもしれません。で要約されているように
Java 仮想マシン仕様の表
,
すべて
加算、除算などの積分演算は、タイプ
int
という型と
long
という型、そして
ではなく
を使用します。
(余談ですが 小さいタイプ(
byte
と
short
) は、基本的に
配列
. また
配列
のように
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_WEEK
を
byte
. しかし、ここでJava Class File Formatの出番です。すべての
クラス・ファイルのフィールド
は少なくとも 1 つの "スロット" を占有し、そのスロットのサイズは 1 つの
int
(32ビット)のサイズを持っています。("wide"フィールド。
double
と
long
は、2つのスロットを占有しています)。ですから、フィールドを明示的に
short
または
byte
もメモリを節約しません。
関連
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] CPUバウンド」「I/Oバウンド」とは、どのような意味ですか?
-
[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?
-
[解決済み] GHCはどのような最適化を確実に実行することが期待できますか?
-
[解決済み] 本番用Webアプリケーションの1秒あたりの「平均」リクエスト数は?
-
[解決済み] なぜJava APIはshortやbyteの代わりにintを使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン