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.
> 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?
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...
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.
> 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!
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.
Very enjoyable. I love these sort of thinking outside the box optimisations.
Maybe I am slow, it took me a while to realize the "14k" in the title refers to "14kB"
> All the formatting in {fmt} is locale-independent by default (which breaks with the C++’s tradition of having wrong defaults)
Chuckles