[解決済み] なぜJavaのbooleanプリミティブのsizeは定義されていないのですか?
質問
その 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ビット未満を使用する場合があり、配列からプリミティブ値をロードおよび格納するために異なるオペコードがあります。ブール値とバイト値の両方が、配列からプリミティブ値をロードし、格納するための異なるオペコードを使用します。
baload
と
bastore
というオペコードがあり、これはブーリアン配列が1要素につき1バイトを取ることを意味します。
メモリ内オブジェクトのレイアウトに関しては、"private implementation"でカバーされています。 ルール で、1 ビット、1 バイト、または他の投稿者が指摘したように、64 ビットのダブルワード境界に整列させることができます。ほとんどの場合、基礎となるハードウェアの基本ワード サイズ (32 ビットまたは 64 ビット) を取ります。
ブーリアンが使用するスペースの量を最小化することに関しては、ほとんどのアプリケーションで本当に問題ではありません。スタック フレーム (ローカル変数とメソッドの引数を保持) はそれほど大きくなく、大きな計画では、オブジェクト内の個別のブーリアンもそれほど大きくはないです。もし、たくさんの boolean を持つオブジェクトがあるならば、ゲッターとセッターで管理されるビットフィールドを使用することができます。しかし、CPU時間のペナルティは、おそらくメモリでのペナルティよりも大きいでしょう。
関連
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
アノテーション「@Retention」の役割
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] 浮動小数点以下の0を削除して文字列に変換する方法
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] java.lang.OutOfMemoryError" の対処法。Java heap space "エラーの対処方法を教えてください。
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
-
[解決済み] Javaにおけるビット演算子のブール値への影響
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
Javaでよくある構文エラー
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
代入の左辺は変数でなければならない 解答
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
htmlとwordの相互変換の実装(画像あり)
-
[解決済み] Javaで、オブジェクトの大きさを決定する最も良い方法は何ですか?