Hacker News

Favorites Setup
Comment by ReDress | original | C for Rust programmers
[−]ReDress · 2026-10-10 Sat 12:12 UTC · link
I'm going to go out on a limb here and make a wild guess.

That boolean is actually mostly an extension of the integer system whereby we now have an integer type that stores only one bit.

Whereby the bit stored either results in a 'true' or 'false' value.

Anyways, I know booleans are useful in systems development when you have strict memory / storage constrains / bandwidth (networks).

Yeah, that works for me.

[−]bjackman · 2026-10-10 Sat 13:13 UTC · link
'bool' is still at least 1 byte in C. If you want to store one Boolean per bit you have to manually implement a bitmap.
[−]tyromaniac · 2026-10-10 Sat 13:20 UTC · link
Or pull out the C++ and use std::vector<bool>,... But you should probably never do that
[−]randomNumber7 · 2026-10-10 Sat 14:31 UTC · link
I heard the C++ guys regret defining vector<bool> using 1 bit per value.

Also for most code it will be premature optimization to worry about that.

[−]KerrAvon · 2026-10-10 Sat 14:47 UTC · link
From what I can tell in a cursory web search, that regret is more about issues with C++ being unable to abstract that field vs bit divergence properly, not about the concept of having the specialization be bit-based, which is sound.
[−]tialaramex · 2026-10-10 Sat 15:41 UTC · link
I think your description is technically accurate, but maybe this phrases it better:

std::vector<bool> is a perfectly nice growable bit array type, and if the exact same code were in the C++ standard library named std::growable_bit_array nobody would be annoyed about this type, some people would use it, others would ignore it, nobody would write epic rants about it or name it the singe worst thing about C++.

The problem is that C++ popularized generics, and std::vector<T> is a generic growable array type, you ask for a std::vector<Goose> you get a growable array of your custom Goose type, great idea, very popular these days -- yet std::vector<bool> is not a generic growable array of bool, it's this other thing instead that's similar but not quite similar enough to be a drop-in replacement.

In C++ there is no way for the specialization to be bit-based without it being apparent that you are not in fact getting a growable array of the bool type.

[−]codys · 2026-10-11 Sun 03:39 UTC · link
No, that's not really an accurate rephrasing. Your comment indicates the problem is that it was exposed as a specialization, KerrAvon is saying the problem was instead that the specialization wasn't effectively abstracted (hidden) behind the API of vector (ie: implication is that ideally we'd have a better API for vector that might require C++ language changes due to the nature of the problems with vector<bool>. not that we shouldn't have the specialization)
[−]tialaramex · 2026-10-11 Sun 09:33 UTC · link
> Your comment indicates the problem is that it was exposed as a specialization

Because that is the problem? That's what C++ programmmers are unhappy about.

> ideally we'd have a better API for vector that might require C++ language changes

Ideally after almost thirty years "maybe we could re-design the whole programming language to paper over this bug?" would be such an obviously bad idea that I wouldn't see it in a response.

[−]viega · 2026-10-10 Sat 13:51 UTC · link
A bool does automatically cast to an unsized bit slice.

Meaning, if you have a struct and you want to bit-pack your booleans, you can declare each one as, say, uint8_t some_bool : 1;

You may then do `x.some_bool = true;` etc.

It's a small nicety to avoid bitwise operators, anyway.

[−]bjackman · 2026-10-11 Sun 09:33 UTC · link
I do tend to think people under use bitfields.

I suspect this is because they are usually introduced like "here are bitfields, but DO NOT USE THEM for anything that might become ABI because their order is implementation defined". I think that causes people to mentally file it under <sketchy language features to avoid> when actually there are many contexts where the ABI risk is not real.

[−]cogman10 · 2026-10-10 Sat 13:25 UTC · link
The way C handles (prior to C23) booleans is pretty close to how you'd handle booleans in assembly.

CPUs don't have types, everything is integers or floats. You do your work on registers which have fixed sizes. CPUs have built in instructions for "is this register not zero" which leaks into C. 1 is true in C, but so is 2.

Also, single bits are rarely used for booleans because it requires more CPU power to extract a single bit. Everything is byte aligned at a minimum.

When doing something like network code, if you want to store a bunch of booleans you are typically going to either pack them into a byte, or you'll burn the extra bits and send a single byte for the boolean value. Typically this was flags and masks.

[−]xhroot · 2026-10-10 Sat 13:47 UTC · link
> single bits are rarely used for booleans

SQL Server still has no boolean type and groups bits in the same row into a byte if possible.

[−]quikoa · 2026-10-10 Sat 15:32 UTC · link
> Also, single bits are rarely used for booleans because it requires more CPU power to extract a single bit.

Not necessarily, on modern CPUs memory access is often the bottleneck. If you have many bits storing these in a bitarray can be quite beneficial for performance.

[−]streganil · 2026-10-11 Sun 10:41 UTC · link
I feel this comment misses some important context; in assembler, you might return a boolean value from a function in a register, but you also might just set a flag (which is much more similar to the "one bit value"). A flag register is very much a set of booleans, not an integer.

> single bits are rarely used for booleans because it requires more CPU power to extract a single bit

I don't believe this to be true; (on x86) `cmp X, 0` is exactly the same amount of operations as `test X, pow2`. One of them is a `sub` and one of them is an `and`. I believe this is how it works on all important CPU architectures of today back to the early microcomputers (although I don't know how the minicomputers handle this, so it's possible that booleans being integers makes more sense on a PDP-11 or a honeywell).