1
25
timhh

@programming.dev

timhh 23 points a year ago

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.

path: 0 17082918 17083395, hotness: undefined, score: 23, children: 4
timhh 14 points a year ago

Catchy. Can't imagine why "algorithm" caught on instead.

path: 0 17205864 17208271 17209484 17209807, hotness: undefined, score: 14, children: 1
timhh 10 points a year ago

Yeah but please don't actually use this. Use a proper UUID library that works cross-platform and lets you choose the UUID type and can be seeded etc.

path: 0 17248279, hotness: undefined, score: 10, children: 2
timhh 8 points a year ago path: 0 17190855, hotness: undefined, score: 8, children: 2
timhh 5 points a year ago

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.

path: 0 17075595 17083432, hotness: undefined, score: 5, children: 10
timhh 4 points a year 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.

path: 0 17096668 17097011 17127478, hotness: undefined, score: 4, children: 0
timhh 4 points a year ago

I disagree. I still easily find new questions to ask, for example this one which is a nice demonstration of why StackOverflow is dying. Or this one (which also received 4 downvotes).

Even so, I definitely go to ChatGPT first now. Now that we finally have an alternative to the toxic downvotes/closing, why would I go there unless I absolutely need to?

path: 0 17169836 17190702, hotness: undefined, score: 4, children: 2
timhh 3 points a year ago

By that measure basically every StackOverflow question asking how to do something is opinion based - the very nature of the site is questions asking for the best solutions. The "opinion based" rules is NOT meant to prevent questions like this. This is the kind of useless pedantry that killed StackOverflow.

I think it comes from a fundamental disconnect. You have something like:

  1. People ask questions like "which programming language is best" or "what's the best game engine" or "should I use tabs or spaces"?
  2. Someone decided they didn't want StackOverflow being used to debate these things, so they made a rule against opinion-based questions.
  3. People later come along and blindly apply the rule to ban anything that is worded as if it is an opinion, even if it's a perfectly suitable question.

not sure why that wasn’t enough for you

I never said it wasn't; just that it shouldn't have been closed.

Just because it’s closed doesn’t mean the answers already provided are bad.

Again, I never said otherwise. The point is it shouldn't have been closed.

path: 0 17190855 17202143 17205788, hotness: undefined, score: 3, children: 0
timhh 2 points a year ago

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.

path: 0 17067565 17070758 17083532, hotness: undefined, score: 2, children: 2
timhh 2 points a year 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.

path: 0 17067297 17067803 17083499 17088203 17099254 17159822, hotness: undefined, score: 2, children: 0
timhh 2 points a year ago

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

path: 0 17101006 17112844 17127404, hotness: undefined, score: 2, children: 0
timhh 2 points a year 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?

path: 0 17067297 17067803 17083499, hotness: undefined, score: 2, children: 12
timhh 1 point a year 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.)
path: 0 17248279 17258870 17431787, hotness: undefined, score: 1, children: 0
timhh 1 point a year ago

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

path: 0 17075595 17083432 17109480 17159748 17167765 17190875, hotness: undefined, score: 1, children: 4
timhh 1 point a year 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.

path: 0 17067297 17067803 17083499 17089549 17159797, hotness: undefined, score: 1, children: 7
timhh 1 point a year ago

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

path: 0 17082918 17083395 17093014 17093843 17094554 17159768, hotness: undefined, score: 1, children: 0
timhh 1 point a year ago

Oo thanks!

path: 0 17169836 17190702 17195462 17201391, hotness: undefined, score: 1, children: 0
timhh 1 point a year 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.

path: 0 17075595 17083432 17109480 17159748 17167765 17190875 17199804 17200199 17206267 17209725, hotness: undefined, score: 1, children: 0
timhh 0 points a year 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.

path: 0 17075595 17083432 17196538 17201384, hotness: undefined, score: 0, children: 0
timhh 0 points a year 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?

path: 0 17067297 17067803 17083499 17089549 17159797 17161725 17190985 17203765 17204741, hotness: undefined, score: 0, children: 3

thanks for using Leebra!

go to feed...