Remix.run Logo
▲ ReDress 19 hours ago

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.

▲cogman10 18 hours ago | parent | next [-]

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.

▲quikoa 15 hours ago | parent | next [-]

> 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.

▲xhroot 17 hours ago | parent | prev [-]

> 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.

▲bjackman 18 hours ago | parent | prev [-]

'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 18 hours ago | parent | next [-]

Or pull out the C++ and use std::vector<bool>,... But you should probably never do that

▲randomNumber7 17 hours ago | parent [-]

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 16 hours ago | parent [-]

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 15 hours ago | parent [-]

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 3 hours ago | parent [-]

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)

▲viega 17 hours ago | parent | prev | next [-]

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.

▲ReDress 18 hours ago | parent | prev [-]

[dead]