• @timhh@programming.dev
    link
    fedilink
    41 month ago

    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?

    • @brian@programming.dev
      link
      fedilink
      21 month ago

      things that store it as word size for alignment purposes (most common afaik), things that pack multiple books into one byte (normally only things like bool sequences/structs), etc

      • @timhh@programming.dev
        link
        fedilink
        128 days 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.

        • @brian@programming.dev
          link
          fedilink
          228 days ago

          sure, but if you have a single bool in a stack frame it’s probably going to be more than a byte. on the heap definitely more than a byte

          • @timhh@programming.dev
            link
            fedilink
            127 days 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.

            • @brian@programming.dev
              link
              fedilink
              226 days ago

              c++ guarantees that calls to malloc are aligned https://en.cppreference.com/w/cpp/memory/c/malloc .

              you can call malloc(1) ofc, 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

              yeah, as I said, in a stack frame. not surprised a compiler packed them into single bytes in the same frame (but I wouldn’t be that surprised the other way either), but the system v abi guarantees at least 4 byte alignment of a stack frame on entering a fn, so if you stored a single bool it’ll get 3+ extra bytes added on the next fn call.

              computers align things. you normally don’t have to think about it. Consider this a TIL moment.

              • @timhh@programming.dev
                link
                fedilink
                126 days 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?

                  • @timhh@programming.dev
                    link
                    fedilink
                    126 days 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.

    • @mmddmm@lemm.ee
      link
      fedilink
      11 month ago

      Apart from dynamically typed languages which need to store the type with the value

      You know that depending on what your code does, the same C that people are talking upthread doesn’t even need to allocate memory to store a variable, right?

        • @timhh@programming.dev
          link
          fedilink
          228 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.