El artículo investiga por qué la primera asignación de memoria en C++ (usando malloc) suele ser de 72 KB. El autor, un desarrollador que experimenta con sus propios allocators de memoria, descubrió este patrón recurrente al registrar el tamaño de las asignaciones. Para rastrear el origen de esta asignación, utilizó gdb para inspeccionar el backtrace, revelando que la llamada a malloc proviene de libstdc++, la biblioteca estándar de C++.
La razón detrás de esta asignación inicial de 72 KB es la configuración de la infraestructura de manejo de excepciones. libstdc++ crea un “pool de emergencia” para almacenar excepciones en caso de que malloc falle. Este pool se asigna de forma perezosa (lazy) al inicio del programa, es decir, solo cuando es necesario. La asignación de 72 KB es el tamaño requerido para este pool de emergencia, calculado en función del tamaño de los objetos de excepción y otros factores relacionados con el manejo de excepciones. El código relevante se encuentra en libstdc++-v3/libsupc++/eh_alloc.cc y libstdc++-v3/src/c++98/pool_allocator.cc, donde se define el tamaño del pool y se realiza la asignación real. La función __cxa_allocate_exception es responsable de la asignación de excepciones, utilizando el pool de emergencia si malloc falla.
Este comportamiento es importante para entender cómo funciona la biblioteca estándar de C++ y cómo se preparan los mecanismos de manejo de excepciones. Si bien puede parecer inusual, es una medida de seguridad para garantizar que las excepciones puedan ser manejadas incluso en situaciones de escasez de memoria. El artículo también menciona el uso de LD_PRELOAD para sobrecargar la función malloc con una implementación personalizada, una técnica útil para depurar y analizar el comportamiento de los allocators de memoria. El autor también destaca la importancia de evitar el uso de malloc dentro de un allocator de memoria personalizado para evitar bucles infinitos y fallos.
