Saya melihat ukuran boolean tidak ditentukan. Di bawah ini adalah dua pernyataan yang saya lihat pada ukuran data primitif java
tidak didefinisikan secara tepat
Penjelasan lebih lanjut mengatakan
boolean mewakili sedikit informasi, tetapi "ukurannya" bukanlah sesuatu yang didefinisikan secara tepat.
Pertanyaan muncul di benak saya adalah mengapa boolean di java tidak dapat direpresentasikan dengan 1 bit (atau 1 byte jika byte adalah representasi minimum)?
Tapi saya melihat itu sudah dijawab di /programming/1907318/why-is-javas-boolean-primitive-size-not-d-dined di mana dikatakan
JVM menggunakan sel stack 32-bit, yang digunakan untuk menyimpan variabel lokal, argumen metode, dan nilai ekspresi. Primitif yang lebih kecil dari 1 sel diisi, primitif lebih besar dari 32 bit (panjang dan ganda) mengambil 2 sel
Apakah ini berarti tipe data byte / char / short primitiva pendek juga membutuhkan 32 bit meskipun ukurannya didefinisikan sebagai 8/16/16 bit?
Juga dapatkah kita mengatakan ukuran boolean akan menjadi 32 bit pada cpu 32 bit dan 64 bit pada cpu 64 bit?
Does it mean even byte/char/short primitiva data types also take 32 bit though their size is defined as 8/16/16 bit ?
-- Iya.Also can we say boolean size will be 32 bit on 32 bit cpu and 64 bit on 64 bit cpu ?
- Tidak. Ukurannya ditentukan oleh JVM.Jawaban:
TL; DR Satu-satunya hal yang pasti adalah yang
boolean
menempati setidaknya satu bit. Segala sesuatu yang lain tergantung pada implementasi JVM.Spesifikasi Bahasa Jawa tidak menentukan ukuran, hanya rentang nilai (lihat Spesifikasi Bahasa ). Jadi, ini bukan hanya
boolean
ukuran yang tidak ditentukan pada level ini. Danboolean
memiliki dua nilai yang mungkin:false
dantrue
.The Virtual Machine Spesifikasi memberitahu kita bahwa
boolean
variabel diperlakukan sepertiint
dengan nilai 0 dan 1. Hanya arrayboolean
memiliki dukungan khusus. Jadi pada tingkat Mesin Virtual,boolean
variabel menempati jumlah ruang yang sama denganint
, artinya satu tumpukan sel: setidaknya 4 byte, biasanya 4 byte pada Java 32-bit dan 8 byte pada 64-bit.Akhirnya ada mesin HotSpot yang mengkompilasi bytecode JVM ke dalam kode mesin CPU-dioptimalkan, dan saya bertaruh bahwa dalam banyak kasus itu mampu menyimpulkan kisaran nilai terbatas
int
-maskedboolean
dari konteks dan menggunakan ukuran yang lebih kecil.sumber
Ada beberapa konsep yang perlu digali:
Java, bahasa pemrograman , tidak mendefinisikan ukuran konsep tipe primitif karena (tidak seperti C / C ++) tidak ada
sizeof
operator: ukuran tidak dapat diamati melalui konstruksi bahasa, sehingga bahasa tidak perlu mendefinisikannya.Seperti @Ralf tunjukkan bahasa Java tidak menentukan kisaran tipe primitif, yang sangat relevan bagi programmer karena rentang ini dapat diamati melalui konstruk dalam bahasa.
Bahasa tidak mendefinisikan kemampuan instrumentasi yang memungkinkan penyelidikan ke ukuran objek, tetapi (1) ini membutuhkan instrumentasi, (2) hanya memberikan perkiraan, dan (3) penyelidikan ini tidak berlaku untuk tipe primitif atau variabel lokal.
Kutipan padding berbicara dengan detail format file kelas JVM, yang digunakan sebagai mekanisme pertukaran (berbeda dari bahasa Jawa dan implementasi JVM). Meskipun apa yang dikatakannya berlaku untuk mesin abstrak dan kode byte JVM, itu tidak harus berlaku untuk kode mesin JIT'ed.
Kutipan padding juga membatasi dirinya untuk diskusi variabel / parameter / ekspresi lokal yang biasanya ditumpuk dialokasikan (misalnya otomatis atau otomatis dalam C / C ++), dan tidak membahas objek / array.
Ukuran aktual dari variabel otomatis semacam itu hampir tidak pernah menjadi masalah (misalnya untuk kinerja atau untuk ruang).
Sebagian, ini karena CPU perangkat keras yang mendasarinya lebih alami bekerja pada ukuran bit yang lebih besar (seperti 32 atau 64) daripada 1-bit. Bahkan ukuran 8 atau 16 bit umumnya tidak lebih cepat dari 32, dan kadang-kadang penanganan 8-bit memerlukan satu atau dua instruksi tambahan untuk bekerja dengan register set perangkat keras yang lebih luas.
Dan alasan lain adalah terbatasnya penggunaan variabel lokal - mereka digunakan secara langsung oleh kode dan hanya dengan kode, dan dengan demikian tidak benar-benar tunduk pada masalah penskalaan - khususnya, dibandingkan dengan objek dan array, yang digunakan oleh struktur data berpotensi skala apa pun .
(Kami mungkin menganggap rekursi sebagai penskalaan variabel lokal, jadi variabel lokal yang lebih besar dalam rutinitas rekursif berisiko menumpuk lebih cepat.)
Namun, ukuran objek bisa sangat berarti, jika jumlah instance tinggi, dan juga, ukuran elemen array dapat menjadi masalah jika memiliki jumlah elemen yang tinggi.
Untuk penduduk setempat, mungkin, mungkin tidak tergantung pada JIT.
Untuk objek, dalam kode byte JVM & mekanisme file kelas, bidang secara langsung diakses oleh identifikasi mereka dan tidak ada gagasan yang diberikan tentang "sel" - sedangkan ada dengan variabel (lokal dan parameter).
Implementasi JVM (termasuk JIT) memiliki fleksibilitas untuk mengatur ulang urutan bidang dalam implementasi (misalnya pada level kode mesin) sehingga dua bidang 16-bit dapat menempati kata 32-bit yang sama bahkan jika tidak dinyatakan secara terpisah dalam kode sumber. ; ini mengurangi overhead yang disebabkan oleh padding yang diperlukan untuk mempertahankan perataan. Setiap perubahan, padding, dan penempatan bidang seperti itu juga sangat spesifik untuk implementasi JVM daripada format interchange JVM. Secara teori, JIT dapat mengemas boolean menjadi satu-bit dalam sebuah array, atau mengemas 8 bidang boolean individu ke dalam satu byte tunggal dalam suatu objek. Yang paling tidak dilakukan adalah pilihan implementasi JVM.
sumber