1. ホーム
  2. java

[解決済み] なぜJavaのbooleanプリミティブのsizeは定義されていないのですか?

2022-09-29 04:22:30

質問

その Java 仮想マシンの仕様 によると、ブーリアン演算のサポートは限られています。 プリミティブ 型のサポートに制限があることを述べています。

真偽値の操作にのみ特化したJava仮想マシン命令はありません。その代わり、真偽値を操作するJavaプログラミング言語の式は、Java仮想マシンのintデータ型の値を使用するようにコンパイルされます。

上記は、(私が誤解しているかもしれませんが)ブーリアン値を操作するときに int データ型が使用されることを示唆していますが、これは 32 ビットのメモリ構造です。ブーリアンが 1 ビットの情報しか表さないことを考えると。

  • なぜ int ではなく、byte または short 型がブール値のプロキシとして使用されないのでしょうか。
  • 任意の JVM のために、正確にどのくらいのメモリが boolean 型を格納するために使用されるかを見つけるための最も信頼できる方法は何ですか?

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

短い答え:はい、boolean 値は 32 ビット実体として操作されますが、boolean の配列は要素ごとに 1 バイトを使用します。

長い答え:JVMは、ローカル変数、メソッド引数、および式値を保持するために使用される32ビットのスタックセルを使用します。1 セルより小さいプリミティブはパディングされ、32 ビットより大きいプリミティブ (long と double) は 2 セルを取ります。この手法はオペコードの数を最小限に抑えますが、いくつかの特殊な副作用があります(バイトをマスクする必要性など)。

配列に格納されたプリミティブは32ビット未満を使用する場合があり、配列からプリミティブ値をロードおよび格納するために異なるオペコードがあります。ブール値とバイト値の両方が、配列からプリミティブ値をロードし、格納するための異なるオペコードを使用します。 baloadbastore というオペコードがあり、これはブーリアン配列が1要素につき1バイトを取ることを意味します。

メモリ内オブジェクトのレイアウトに関しては、"private implementation"でカバーされています。 ルール で、1 ビット、1 バイト、または他の投稿者が指摘したように、64 ビットのダブルワード境界に整列させることができます。ほとんどの場合、基礎となるハードウェアの基本ワード サイズ (32 ビットまたは 64 ビット) を取ります。


ブーリアンが使用するスペースの量を最小化することに関しては、ほとんどのアプリケーションで本当に問題ではありません。スタック フレーム (ローカル変数とメソッドの引数を保持) はそれほど大きくなく、大きな計画では、オブジェクト内の個別のブーリアンもそれほど大きくはないです。もし、たくさんの boolean を持つオブジェクトがあるならば、ゲッターとセッターで管理されるビットフィールドを使用することができます。しかし、CPU時間のペナルティは、おそらくメモリでのペナルティよりも大きいでしょう。