It's kind of mindblowing to see how much code floating point formatting needs.<p>The linked dragonbox [1] project is also worth a read. Pretty optimized for the least used branches.<p>[1] <a href="https://github.com/jk-jeon/dragonbox">https://github.com/jk-jeon/dragonbox</a>
> 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.<p>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...<p>strings are ~4 instructions (test for null terminator, output character, branch back two).<p>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.<p>Floats aren't used by many programs so shouldn't be compiled unless needed. Same with hex and pointers and leading zeros etc.<p>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: <a href="https://github.com/pts/minilibc686">https://github.com/pts/minilibc686</a><p>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.<p>Interesting, I've never done this test!
It's always fmt. Incredibly funny that <i>this exact problem</i> 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.