• by magnio on 9/1/2024, 9:10:26 AM

    > All the formatting in {fmt} is locale-independent by default (which breaks with the C++’s tradition of having wrong defaults)

    Chuckles

  • by h4ck_th3_pl4n3t on 9/1/2024, 9:13:28 AM

    It's kind of mindblowing to see how much code floating point formatting needs.

    The linked dragonbox [1] project is also worth a read. Pretty optimized for the least used branches.

    [1] https://github.com/jk-jeon/dragonbox

  • by pzmarzly on 9/1/2024, 9:44:38 AM

    > However, since it may be used elsewhere, a better solution is to replace the default allocator with one that uses malloc and free instead of new and delete.

    C++ noob here, but is libc++'s default allocator (I mean, the default implementation of new and delete) actually doing something different than calling libc's malloc and free under the hood? If so, why?

  • by londons_explore on 9/1/2024, 9:43:27 AM

    I kinda hoped a formatting library designed to be small and able to print strings, and ints ought to be ~50 bytes...

    strings are ~4 instructions (test for null terminator, output character, branch back two).

    Ints are ~20 instructions. Check if negative and if so output '-' and invert. Put 1000000000 into R1. divide input by R1, saving remainder. add ASCII '0' to result. Output character. Divide R1 by 10. put remainder into input. Loop unless R1=0.

    Floats aren't used by many programs so shouldn't be compiled unless needed. Same with hex and pointers and leading zeros etc.

    I can assure you that when writing code for microcontrollers with 2 kilobytes of code space, we don't include a 14 kilobyte string formatting library...

  • by ptspts on 9/1/2024, 11:48:08 AM

    Shameless plug: printf(Hello, World!\n"); is possible with an executable size of 1008 bytes, including libc with output buffering: https://github.com/pts/minilibc686

    Please note that a direct comparison would be apples-to-oranges though.

  • by a1o on 9/1/2024, 11:27:19 AM

    > Considering that a C program with an empty main function is 6kB on this system, {fmt} now adds less than 10kB to the binary.

    Interesting, I've never done this test!

  • by neonsunset on 9/1/2024, 10:12:15 AM

    It's always fmt. Incredibly funny that this exact problem now happens in .NET. If you touch enough numeric (esp. fp and decimal) formatting/parsing bits, linker ends up rooting a lot of floating point and BigInt related code, bloating binary size.

  • by msephton on 9/1/2024, 11:26:33 AM

    Very enjoyable. I love these sort of thinking outside the box optimisations.

  • by rty32 on 9/1/2024, 12:27:51 PM

    Maybe I am slow, it took me a while to realize the "14k" in the title refers to "14kB"