Jawaban:
Karena CPU tidak dapat menangani sesuatu yang lebih kecil dari satu byte.
bt
, bts
, btr
dan btc
dapat mengatasi bit tunggal!
bt
alamat offset byte dan kemudian menguji bit pada offset tertentu, terlepas dari itu, ketika menentukan alamat yang Anda masukkan dalam byte ... literal offset bit akan menjadi sedikit bertele-tele (maafkan permainan kata).
Dari Wikipedia :
Secara historis, byte adalah jumlah bit yang digunakan untuk menyandikan satu karakter teks di komputer dan karena alasan inilah elemen beralamat dasar di banyak arsitektur komputer.
Jadi byte adalah yang satuan dialamatkan dasar , di bawah ini yang arsitektur komputer tidak bisa alamat. Dan karena tidak (mungkin) ada komputer yang mendukung 4-bit byte, Anda tidak memiliki 4-bit bool
dll.
Namun, jika Anda dapat merancang arsitektur yang dapat menangani 4-bit sebagai unit beralamat dasar, maka Anda akan memiliki bool
ukuran 4-bit, hanya di komputer itu!
int
dan char
dari postingan saya.
bool
, karena char
ini adalah unit terkecil yang dapat dialamatkan dalam C ++ , terlepas dari apa yang dapat ditangani oleh arsitektur dengan opcode-nya sendiri. sizeof(bool)
harus memiliki nilai minimal 1, dan bool
objek yang berdekatan harus memiliki alamatnya sendiri di C ++ , jadi penerapannya hanya perlu membuatnya lebih besar dan membuang memori. Itulah mengapa bit field ada sebagai kasus khusus: anggota bitfield dari struct tidak diharuskan untuk dapat dialamatkan secara terpisah, jadi mereka bisa lebih kecil dari a char
(walaupun struct keseluruhan masih tidak bisa).
char
adalah unit beralamat terkecil dalam C ++?
sizeof(bool)
tidak bisa 0,5 :-) Saya kira sebuah implementasi secara legal dapat menyediakan pointer sub-byte sebagai perpanjangan, tetapi objek "biasa" seperti bool, dialokasikan dengan cara biasa, harus melakukan apa yang dikatakan standar.
Jawaban termudah adalah; itu karena CPU mengalamatkan memori dalam byte dan bukan dalam bit, dan operasi bitwise sangat lambat.
Namun, dimungkinkan untuk menggunakan alokasi ukuran bit di C ++. Ada spesialisasi std :: vector untuk vektor bit, dan juga struct mengambil entri berukuran bit.
Kembali ke masa lalu ketika saya harus berjalan ke sekolah dalam badai salju yang mengamuk, menanjak dua arah, dan makan siang adalah hewan apa pun yang dapat kami lacak di hutan di belakang sekolah dan bunuh dengan tangan kosong, komputer memiliki memori yang jauh lebih sedikit daripada yang tersedia. hari ini. Komputer pertama yang saya gunakan memiliki RAM 6K. Bukan 6 megabyte, bukan 6 gigabyte, 6 kilobyte. Dalam lingkungan itu, sangat masuk akal untuk mengemas sebanyak mungkin boolean ke dalam int, jadi kami akan secara teratur menggunakan operasi untuk mengeluarkan dan memasukkannya.
Saat ini, ketika orang-orang mengejek Anda karena hanya memiliki 1 GB RAM, dan satu-satunya tempat Anda dapat menemukan hard drive dengan kurang dari 200 GB adalah di toko barang antik, tidak ada gunanya mengemas sedikit.
Anda dapat menggunakan bidang bit untuk mendapatkan bilangan bulat dengan ukuran sub.
struct X
{
int val:4; // 4 bit int.
};
Meskipun biasanya digunakan untuk memetakan struktur ke pola bit yang diharapkan perangkat keras secara tepat:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
Anda bisa memiliki bit 1-bit dan int 4 dan 2-bit. Tapi itu akan membuat set instruksi aneh tanpa perolehan kinerja karena itu cara yang tidak wajar untuk melihat arsitektur. Sebenarnya masuk akal untuk "membuang" bagian yang lebih baik dari satu byte daripada mencoba untuk mendapatkan kembali data yang tidak digunakan itu.
Satu-satunya aplikasi yang mengganggu untuk mengemas beberapa bools menjadi satu byte, menurut pengalaman saya, adalah Sql Server.
bool
bisa satu byte - ukuran CPU terkecil yang dapat dialamatkan, atau bisa lebih besar. Bukan hal yang aneh harus bool
berukuran sebesar itu int
untuk tujuan kinerja. Jika untuk tujuan tertentu (katakanlah simulasi perangkat keras) Anda memerlukan tipe dengan N bit, Anda dapat menemukan perpustakaan untuk itu (misalnya perpustakaan GBL memiliki BitSet<N>
kelas). Jika Anda khawatir dengan ukuran bool
(Anda mungkin memiliki wadah besar,) maka Anda dapat mengemas bit sendiri, atau gunakan std::vector<bool>
yang akan melakukannya untuk Anda (hati-hati dengan yang terakhir, karena tidak memenuhi persyaratan wadah).
Karena pada umumnya CPU mengalokasikan memory dengan 1 byte sebagai basic unitnya, meskipun beberapa CPU seperti MIPS menggunakan word 4 byte.
Namun vector
transaksi bool
dengan cara khusus, dengan vector<bool>
satu bit untuk setiap bool dialokasikan.
lw
/ sw
jauh lebih banyak digunakan.
Byte adalah unit penyimpanan data digital yang lebih kecil dari sebuah komputer. Di komputer, RAM memiliki jutaan byte dan siapa pun di antaranya memiliki alamat. Jika ia memiliki alamat untuk setiap bit, komputer dapat mengelola RAM 8 kali lebih sedikit dari yang ia bisa.
Info lebih lanjut: Wikipedia
Meskipun ukuran minimum yang memungkinkan adalah 1 Byte, Anda dapat memiliki 8 bit informasi boolean pada 1 Byte:
http://en.wikipedia.org/wiki/Bit_array
Bahasa Julia memiliki BitArray misalnya, dan saya membaca tentang implementasi C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. Kebanyakan kompiler akan mengalokasikan penuhunsigned int
, namun mereka menangani bit-twiddling itu sendiri saat Anda membaca / menulis. Juga mereka menangani sendiri operasi modulo. Itu adalahunsigned small : 4
atribut yang memiliki nilai antara 0 dan 15, dan ketika harus mencapai 16, itu tidak akan menimpa bit sebelumnya :)