4 ms·
How many options fit into a boolean?
- pavon 7mo agoNeat. Even knowing about niche optimization I would have guessed that you could fit 7 Options - one bit for each. But the developers were smart enough to take advantage of the fact that you can't have a Some nested below a None, so you only need to represent how many Somes there are before you reach None (or the data), allowing 254 possibilities.
- gizmo686 7mo agoI doubt they were thinking about Option<bool> when making niches work like this. Option<NonZeroU32> seems like a much more reasonable to justify this with. Also, enums can easily have invalid bit patterns that are unused without there being any specific bit that is always available. All you need is a single variant of the enum to have a free bit, and you have a niche to shove None into.
- mock-possum 7mo ago> looking at Rust … it turns out that `Option<bool>` takes up exactly one byte of memory, the same as bool! The same is true for `Option<Option<bool>>`, all the way up to 254 nested options. Ah how many of those options fit into that boolean. Word games!
- nine_k 7mo agoThe scoop: a boolean can't be smaller than a byte. Full 254 level of nested Option<bool> fit into it. (C++ needs much more for even a single level.)
- priowise 7mo ago[dead]
- RobotToaster 7mo ago>and that it takes up one byte of memory You can make them smaller using bitfields in C.
- russdill 7mo agoUm, no. Please show me how you can fit 255 possible states in something smaller than a byte by using bitfields.
- RobotToaster 7mo agoI was quoting the first paragraph, where it says a single normal bool takes a byte.
- AlotOfReading 7mo agoThe object it's inside will still take up at least one byte. sizeof(struct {bool a:1;}) == sizeof(char);
- hinkley 7mo agoAmortization. If one Boolean must be a byte then 8 must be eight bytes. Which is not true. A boolean can be 1/8th of a byte which is a meaningful distinction.
- hinkley 7mo ago3^5 is 243 so one could also call an optional Boolean 1/5th of a byte, though 1/4 is so much simpler to read and write.
- gottheUIblues 7mo agoA trit is log(3)/(8log(2))=0.19812031259014 of a byte
- 5o1ecist 7mo ago[dead]
- shagie 7mo agoFor Java developers... you can use Optional<Boolean> to store the elusive four possible booleans.
- nitnelave 7mo ago5, no? Null, Optional::empty, Optional(null), Optional(true), Optional(false)
- shagie 7mo agopublic static void main (String[] args) { Optional<Boolean> n = Optional.ofNullable(null); Optional<Boolean> e = Optional.empty(); System.out.println(n.equals(e)); } true https://ideone.com/EGRdi5 https://ideone.com/EGRdi5 A null in an Optional is empty. So you've got: Optional<Boolean> n = null; Optional<Boolean> e = Optional.empty(); Optional<Boolean> t = Optional.of(Boolean.TRUE); Optional<Boolean> f = Optional.of(Boolean.FALSE);
- nitnelave 7mo agoI guess I was missing the NPE: https://ideone.com/rp4Nvv https://ideone.com/rp4Nvv Optional.of(null) throws an NPE
- ralferoo 7mo agoTrue | False | FileNotFound was a meme about 2 decades ago, and even that was a reference to MSDOS from another 2 decades earlier. I guess things never change, only the language. Even now, I still find myself using true/false/null on occasions, but I'm usually smart enough to replace it with an enum at that point. The only time I don't is when it's an optional parameter to a function to override some default/existing value, at which point it then makes sense to keep it as an optional bool.
- gizmo686 7mo agoI'm surprised that trinary logic has not become a standard part of standard libraries yet. Almost every project I have worked on ends up with some form of a yes/no/maybe abstraction.
- hinkley 7mo agoWith privacy coming back into vogue, it’s useful to distinguish “we didn’t ask” from “they wouldn’t answer” For some vector logic the distinction could matter.
- Aurornis 7mo agoYes/No/Maybe is a good fit for an enum because “Maybe” carries some specific information. For more common situations where the yes/no bool is not available yet or should not be considered, constructs like Rust’s Option<bool> are a very good fit. Layering the bool inside of an Option creates intentional handling about the presence or lack of value first before you can work with it.
- hinkley 7mo agoI did a govt contract early on and learned that yes/no/unanswered/unasked was a common quad. I see that in disclosures when applying for jobs as well.
- nine_k 7mo agoThis just means that the problem requires more than a Boolean, but rather something like boolean | error. In many languages from the OOP heyday that alternative part was expressed via throwing an exception.
- vadelfe 7mo agoThe deeper you go into memory layout, the more you realize that even "simple" types aren't that simple.
- gizmo686 7mo agoIt's not clear from the article, but "niche optimization" does not mean "optimization that is only useful in a very specific circumstance". It is a specific optimization based on the idea of storing one type inside of another type by finding a "niche" of unused bit pattern(s) inside the second type. It has far more useful application than a tower of Option 254 deep.
- gima 7mo ago"How many options fit into a boolean?" Five or two, according* to Microsoft. > MsoTrioState is "a tri-state Boolean value". it has five possible values. only two of them are supported. *) https://learn.microsoft.com/en-au/dotnet/api/microsoft.office.core.msotristate https://learn.microsoft.com/en-au/dotnet/api/microsoft.offic... Sourced from here https://fedi.lynnesbian.space/@lynnesbian/115969259564305759 https://fedi.lynnesbian.space/@lynnesbian/115969259564305759
- rf15 7mo agoFunnily enough that was also my first idea upon reading the headline. So let's remember: some programmer, somewhere, is right now thinking about building a tri-state boolean because they think it fits their current problem perfectly fine. And they are always wrong.
- gizmo686 7mo agoI've implemented trits a bunch of times and have never regretted it. How you get 5 possible values into a tri state Boolean is beyond me though.
- xen0 7mo agoThat is... amazing. I think my favourite part is the fact that '1' isn't even one of the supported values.
- johnthescott 7mo agoa two bit, boolish data type used for simple replies from a network: true, false, null and waiting. called a "rummy".