Why is the first C++ (m)allocation always 72 KB?

9 hours ago (joelsiks.com)

Reading this was a good reminder not to be intimidated by assumptions about complexity. (Without giving it much thought) I would have assumed that it would be hard to replace malloc for such fundamental applications as ls, but it's surprisingly simple.

Huh. Why is this emergency pool not statically allocated? Is it possible to tune the size of this pool on libc++ startup somehow? Because otherwise it absolutely should've been statically allocated.

  • I did mention it briefly in the post, but you can opt-in for a fixed-size statically allocated buffer by configuring libstdc++ with --enable-libstdcxx-static-eh-pool. Also, you can opt-out of the pool entirely by configuring the number of objects in the pool to zero with the environment variable GLIBCXX_TUNABLES=glibcxx.eh_pool.obj_count=0.

    • I wonder why it’s opt-in. Maybe it’s part of the whole “you only pay for what you use” ethos, i.e. you shouldn’t have to pay the cost for a static emergency pool if you don’t even use dynamic memory allocation.

I would like the see the source code for libmymalloc.so, however, I don't see anything in the blog post. Nor do I see anything in his GitHub profile: https://github.com/jsikstro

Also, I cannot find his email address anywhere (to ask him to share it on GitHub).

Am I missing something?

  • dlsym() with the RTLD_NEXT flag basically:

    https://catonmat.net/simple-ld-preload-tutorial-part-two

    There's actually a better way to hook GNUs malloc:

    https://www.man7.org/linux/man-pages/man3/malloc_hook.3.html

    This is better because you can disable the hook inside the callback, and therefore use malloc within your malloc hook (no recursion)

    But you can't use this mechanism before main()

    •     The use of these hook functions is not safe in multithreaded
          programs, and they are now deprecated.  From glibc 2.24 onwards,
          the __malloc_initialize_hook variable has been removed from the
          API, and from glibc 2.34 onwards, all the hook variables have been
          removed from the API.  Programmers should instead preempt calls to
          the relevant functions by defining and exporting malloc(), free(),
          realloc(), and calloc().

      3 replies →

> TLDR; The C++ standard library sets up exception handling infrastructure early on, allocating memory for an “emergency pool” to be able to allocate memory for exceptions in case malloc ever runs out of memory.

Reminds me of Perl's $^M: https://perldoc.perl.org/variables/$%5EM

In Perl you can "hand-manage" that. This line would allocate a 64K buffer for use in an emergency:

    $^M = 'a' x (1 << 16);