timhh

joined 1 week ago
[–] [email protected] 2 points 4 days ago

I think he's talking about if a variable only exists in registers. In which case it is the size of a register. But that's true of everything that gets put in registers. You wouldn't say uint16_t is word-sized because at some point it gets put into a word-sized register. That's dumb.

[–] [email protected] 1 points 4 days ago (7 children)

things that store it as word size for alignment purposes

Nope. bools only need to be naturally aligned, so 1 byte.

If you do

struct SomeBools {
  bool a;
  bool b;
  bool c;
  bool d;
};

its 4 bytes.

[–] [email protected] 1 points 4 days ago

The biggest problem is that each element doesn't have a unique memory address; iterators aren't just pointers.

[–] [email protected] 0 points 4 days ago (6 children)

You can’t read one byte

lol what. You can absolutely read one byte: https://godbolt.org/z/TeTch8Yhd

On ARM it's ldrb (load register byte), and on RISC-V it's lb (load byte).

Every decent compiler will turn booleans into words.

No compiler I know of does this. I think you might be getting confused because they're loaded into registers which are machine-word sized. But in memory a bool is always one byte.

[–] [email protected] 4 points 5 days ago

I’m guessing there’s a reason they wanted min() to be able to be called without any arguments but I’m sure it isn’t a good one.

It not a totally unreasonable definition. For example it preserves nice properties like min(a.concat(b)) == min([min(a), min(b)]).

Obviously the correct thing to do is to return an optional type, like Rust does. But ... yeah I mean considering the other footguns in Javascript (e.g. the insane implicit type coersion) I'd say they didn't do too badly here.

[–] [email protected] 2 points 5 days ago

Completely wrong. I'm hoping this was a joke... :-D

[–] [email protected] 0 points 1 week ago

You can't store data in parity bits... so it's irrelevant.

[–] [email protected] 2 points 1 week ago (2 children)

It's not just less memory though - it might also introduce spurious data dependencies, e.g. to store a bit you now need to also read the old value of the byte that it's in.

[–] [email protected] 2 points 1 week ago (12 children)

I don't think so. Apart from dynamically typed languages which need to store the type with the value, it's always 1 byte, and that doesn't depend on architecture (excluding ancient or exotic architectures) or optimisation flags.

Which language/architecture/flags would not store a bool in 1 byte?

[–] [email protected] 5 points 1 week ago* (last edited 1 week ago) (10 children)

No it isn't. All statically typed languages I know of use a byte. Which languages store it in an entire 32 bits? That would be unnecessarily wasteful.

[–] [email protected] 24 points 1 week ago (4 children)

Well there are containers that store booleans in single bits (e.g. std::vector<bool> - which was famously a big mistake).

But in the general case you don't want that because it would be slower.

view more: ‹ prev next ›