Dalam C ++, saya bertanya-tanya mengapa tipe bool panjangnya 8 bit (di sistem saya), di mana hanya satu bit yang cukup untuk menyimpan nilai boolean?
Saya dulu percaya itu untuk alasan kinerja, tetapi kemudian pada mesin 32 bit atau 64 bit, di mana register lebar 32 atau 64 bit, apa keuntungan kinerja?
Atau hanya salah satu dari alasan 'historis' ini?
sizeof(bool)
4. Saya bisa bersumpah bahwa msvc memiliki 32-bit bools, tetapi saya hanya mencoba dan tidak.vector<bool>
bukan karena mencoba menjadi pintar dan mengemas bool menjadi bit, tetapi mencoba untuk melakukan ini dan menyamar sebagai wadah STL . Bitet biasa akan baik-baik saja asalkan tidak juga berpura-pura menjadi wadah STL.bool
tipe data C ++ denganBOOL
tipe Windows yang diketikkanlong
. Jadisizeof(bool) != sizeof(BOOL)
, yang saya yakin menyebabkan banyak kebingungan (dan mungkin banyak bug). Terutama karena ada jugaboolean
danBOOLEAN
typedef di Windows, yang merupakan alias untukunsigned char
. Juga, perhatikan bahwa meskipun umum untukbool
1 byte, standar C ++ memiliki catatan yang secara khusus menunjukkan bahwasizeof(bool)
bisa lebih besar.Jawaban:
Karena setiap tipe data C ++ harus dialamatkan.
Bagaimana Anda membuat pointer ke bit tunggal? Kamu tidak bisa Tapi Anda bisa membuat pointer ke byte. Jadi boolean di C ++ biasanya berukuran byte. (Ini mungkin lebih besar juga. Itu hingga implementasi. Hal utama adalah bahwa itu harus dialamatkan, sehingga tidak ada tipe data C ++ bisa lebih kecil dari satu byte)
sumber
Memori byte addressable. Anda tidak dapat menangani sedikit pun, tanpa menggeser atau menutupi byte yang dibaca dari memori. Saya akan membayangkan ini adalah alasan yang sangat besar.
sumber
Suatu
boolean
tipe biasanya mengikuti unit terkecil dari memori yang dapat dialamatkan dari mesin target (yaitu biasanya byte 8bits).Akses ke memori selalu dalam "potongan" (banyak kata, ini untuk efisiensi di tingkat perangkat keras , transaksi bus): bit boolean tidak dapat diatasi "sendirian" di sebagian besar sistem CPU. Tentu saja, begitu data terkandung dalam register , seringkali ada instruksi khusus untuk memanipulasi bit secara independen.
Untuk alasan ini, sangat umum untuk menggunakan teknik "bit packing" untuk meningkatkan efisiensi dalam menggunakan tipe data base "boolean". Teknik seperti
enum
(dalam C) dengan kekuatan 2 pengkodean adalah contoh yang baik. Trik yang sama ditemukan di sebagian besar bahasa.Diperbarui : Berkat diskusi yang luar biasa, saya tertarik
sizeof(char)==1
pada definisi C ++. Oleh karena itu, menangani tipe data "boolean" sangat terkait dengan unit terkecil dari memori yang dapat dialamatkan (memperkuat poin saya).sumber
bool
tipe mengikuti unit terkecil dari memori yang dapat dialokasikan karena C ++ mengharuskan Anda harus membuat pointer ke sana . Tanpa persyaratan itu, abool
bisa saja direpresentasikan sebagai bit tunggal bahkan pada mesin byte-addressable saat ini.sizeof(char)==1 definition
itulah argumen balasan terbaik untuk argumentasi saya. Terima kasih!Jawaban tentang 8-bit menjadi jumlah terkecil dari memori yang dapat dialamatkan adalah benar. Namun, beberapa bahasa dapat menggunakan 1-bit untuk boolean, dengan cara tertentu. Saya ingat Pascal mengimplementasikan set sebagai string bit. Yaitu, untuk set berikut:
Anda mungkin memiliki ini dalam memori:
Anda dapat, tentu saja, melakukan sesuatu yang serupa di C / C ++ jika Anda mau. (Jika Anda melacak sekelompok boolean, itu bisa masuk akal, tetapi itu benar-benar tergantung pada situasinya.)
sumber
vector
. Ini sebenarnya bukan tipe wadah STL, karena ada kendala pada perilaku. Yang lebih buruk adalah bahwa hal itu menyebabkan masalah dengan seseorang yang memilikibool
dan ingin membuatnyavector
. Itu adalah perilaku yang mengejutkan, dan bukan itu yang Anda inginkan dalam suatu bahasa.Saya tahu ini sudah tua tapi saya pikir saya akan memasukkan 2 sen saya.
Jika Anda membatasi tipe boolean atau data Anda menjadi satu bit saja maka aplikasi Anda berisiko mengalami peningkatan memori. Bagaimana Anda menangani statistik kesalahan dalam memori yang hanya satu bit?
Saya pergi ke sebuah wawancara kerja dan salah satu pernyataan yang ketua program katakan kepada saya adalah, "Ketika kami mengirim sinyal untuk meluncurkan rudal, kami hanya mengirim bit on-bit sederhana melalui nirkabel. Mengirim satu bit sangat cepat dan kami membutuhkan sinyal itu secepat mungkin. "
Yah, itu adalah tes untuk melihat apakah saya memahami konsep dan bit, byte, dan penanganan kesalahan. Betapa mudahnya bagi orang jahat untuk mengirim pesan satu bit. Atau apa yang terjadi jika selama transmisi bit akan terbalik.
sumber
bool
menggunakan 8 bit pada mesin OP dan 32 pada tambang, karena 7 atau 31 bit lainnya tentu tidak digunakan untuk "statistik kesalahan". Ini tidak masuk akalBeberapa kompiler tertanam memiliki tipe int1 yang digunakan untuk mengemas flag boolean (misalnya seri CCS dari kompiler C untuk Microchip MPU's). Pengaturan, kliring, dan pengujian variabel-variabel ini menggunakan instruksi level bit instruksi tunggal, tetapi kompiler tidak akan mengizinkan operasi lain (misalnya mengambil alamat variabel), karena alasan yang disebutkan dalam jawaban lain.
sumber