Is bool guaranteed to be 1 byte?
While historically there was a wish to avoid committing to a more specific representation, it was eventually decided in January 2018 that bool
should provide the following guarantees:
- The definition of
bool
is equivalent to the C99 definition of_Bool
- In turn, for all currently supported platforms, the size of
bool
is exactly 1.
- In turn, for all currently supported platforms, the size of
The documentation has been updated accordingly. In the Rust reference, bool
is defined as thus:
The
bool
type is a datatype which can be eithertrue
orfalse
. The boolean type uses one byte of memory. [...]
It has also been documented since 1.25.0 that the output of std::mem::size_of::<bool>()
is 1.
As such, one can indeed rely on bool
being 1 byte (and if this is ever to change, it will be a pretty loud change).
See also:
- In C how much space does a bool (boolean) take up? Is it 1 bit, 1 byte or something else?
- Why is a boolean 1 byte and not 1 bit of size? (C++)
Rust emits i1
to LLVM for bool
and relies on whatever it produces. LLVM uses i8
(one byte) to represent i1
in memory for all the platforms supported by Rust for now. On the other hand, there's no certainty about the future, since the Rust developers have been refusing to commit to the particular bool
representation so far.
So, it's guaranteed by the current implementation but not guaranteed by any specifications.
You can find more details in this RFC discussion and the linked PR and issue.
Edit: Please, see the answer below for more information about changes introduced in Rust since this answer had been published.