[-] [email protected] 1 points 1 month ago

There are a few reasons you shouldn't use this in proper programs. If you're the sort of person that thinks hacky Bash scripts are acceptable then sure, use it there.

  1. It isn't cross-platform. Not available on Mac/Windows.
  2. There are several types of UUID with different properties. This doesn't let you choose which one to use.
  3. To make programs deterministic (really useful for testing!) you want to be able to seed all their randomness with a specific seed so that it generates the same UUID each time you run it. (Obviously in normal use you would use a random seed.)
[-] [email protected] 1 points 1 month ago* (last edited 1 month ago)

What docs? A bool is one byte. Get over it. Find me one normal compiler/architecture in C, C++, Go, Rust, Zig, etc. where it is not. Go on.

[-] [email protected] 0 points 1 month ago

It is not. A bool in C, C++, Rust, Go, and every language that I know is 1 byte. Why are you arguing this basic very well known fact so much?

Just say "oh I was mistaken, TIL". It's not shameful.

[-] [email protected] 0 points 1 month ago

but calling malloc_usable_size(malloc(1)) is giving me 24, so it at least allocated 24 bytes for my 1, plus any tracking overhead

Indeed. Padding exists. A bool is still one byte.

it’ll get 3+ extra bytes added on the next fn call.

...of padding. Jesus. Are you going to claim that uint16_t is not 2 bytes because it is sometimes followed by padding?

[-] [email protected] 1 points 1 month ago
[-] [email protected] 0 points 1 month ago

No, in C and C++ a bool is a byte.

since many CPUs require that for whole-word load and store instructions

All modern architectures (ARM, x86 RISC-V) support byte load/store instructions.

or only support a stack pointer that increments in whole words

IIRC the stack pointer is usually incremented in 16-byte units. That's irrelevant though. If you store a single bool on the stack it would be 1 byte for the bool and 15 bytes of padding.

A single byte or bool field within a struct or object will likely result in a whole word being allocated, so that other variables and be word-aligned

Again, no. I think you've sort of heard about this subject but haven't really understood it.

The requirement is that fields are naturally aligned (up to the machine word size). So a byte needs to be byte-aligned, 2-bytes needs to be 2-byte aligned, etc.

Padding may be inserted to achieve that but that is padding it doesn't change the size of the actual bool, and it isn't part of the bool.

But if you have multiple less-than-a-word fields, they can be packed together.

They will be, if it fits the alignment requirements. Create a struct with 8 bools. It will take up 8 bytes no matter what your packing setting is. They even give an example:

If you specify the default packing size, the size of the structure is 8 bytes. The two bytes occupy the first two bytes of memory, because bytes must align on one-byte boundaries.

They used byte here but it's the same for bool because a bool is one byte.

I'm really surprised how common this misconception is.

[-] [email protected] 0 points 1 month ago

Wrong again. It depends on the CPU. They can absolutely read a single byte and they will do if you're reading from non-idempotent memory.

If you're reading from idempotent memory they won't read a byte or a word. They'll likely read a whole cache line (usually 64 bytes).

And if you read the ARM article you linked, it literally says so.

Where?

Thus any compiler worth their salt will align all byte variables to words for faster memory access.

No they won't because it isn't faster. The CPU will read the whole cache line that contains the byte.

RTFM

Well, I would but no manual says that because it's wrong!

[-] [email protected] 0 points 1 month ago

but if you have a single bool in a stack frame it’s probably going to be more than a byte.

Nope. - if you can't read RISC-V assembly, look at these lines

        sb      a5,-17(s0)
...
        sb      a5,-18(s0)
...
        sb      a5,-19(s0)
...

That is it storing the bools in single bytes. Also I only used RISC-V because I'm way more familiar with it than x86, but it will do the same thing.

on the heap definitely more than a byte

Nope, you can happily malloc(1) and store a bool in it, or malloc(4) and store 4 bools in it. A bool is 1 byte. Consider this a TIL moment.

[-] [email protected] 1 points 1 month ago

You said you can't read one byte. I showed that you can. Where's the confusion?

[-] [email protected] 1 points 1 month ago

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 1 month ago

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

[-] [email protected] 0 points 1 month ago

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

view more: ‹ prev next ›

timhh

0 post score
0 comment score
joined 1 month ago