I recently started learning to write code, and in my book I came across this question. “Why is a Boolean value stored as a byte inside of a computer when it only requires one bit?” can someone shed more light on this question?
4
It has to do with what the CPU can easily address. For example on an x86 processor there is an eax
(32 bits), ax
(16 bits) and a ah
(8 bits) but no single bit register. So in order for it to use a single bit the CPU will have to do a read/modify/write to change the value. If it is stored as a byte a single read or write can be used to inspect/change the value.
Additionally one might wonder if it would be better to use a single bit vs a full byte, after all a byte will be wasting 7 bits. Unless space is a constraint the one should go for the byte because, at least the x86 and I think others, there is usually an instructions to quickly set/clear a bool which is much quicker than the read/modify/write of a single bit. From personal measurements I have seen the read/mod/write method be 5x slower than the single instruction method.
2
As @barrem23 explains, the data must be addressable, and the smallest boundary on conventional architectures is a byte.
But since this question is tagged as c++, it may be worth pointing out that std::vector<bool>
is specialized to allow individual elements to be stored as bits. This will save space by sacrificing some functionality (for example, std::search
may not work).
It will never be 1 bit, if you group 8 booleans in one byte, you still need 3 bits for each boolean for addressing (2^3 space), that is to know which bit inside the byte belongs to which boolean.
Also you might need one additional bit for nullability checking since you can’t have a null bit, so you need one more bit for that, and you end up having 5 bits for each boolean rather than 1 byte (1 for value, 1 for null, and 3 for addressing), which is not that significant optimization.
3