Недавно я был ознакомлен с встроенными функциями GCC для некоторых функций управления памятью библиотеки C, в частности __builtin_malloc() и связанных с ними встроенных модулей (см. https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html). Узнав о __builtin_malloc(), мне было интересно, как это может работать, чтобы обеспечить повышение производительности по сравнению с обычными библиотечными программами, связанными с malloc().
Например, если функция завершается успешно, она должна обеспечить блок, который может быть освобожден вызовом plain free(), поскольку указатель может быть освобожден модулем, который был скомпилирован без __builtin_malloc() или __builtin_free() включен (или я ошибаюсь об этом, и если используется __builtin_malloc(), встроенные функции должны быть глобально использованы?). Следовательно, выделенный объект должен быть чем-то, с чем можно управлять с структурами данных, с которыми имеют дело простые malloc() и free().
Я не могу найти каких-либо подробностей о том, как работает __builtin_malloc() или что он делает (я не являюсь компилятором dev, поэтому spelunking через исходный код GCC отсутствует в моей рулевой рубке). В некоторых простых тестах, где я пытался напрямую вызвать __builtin_malloc(), он просто заканчивается тем, что в объектном коде испускается как вызов простого malloc(). Тем не менее, могут быть тонкости или детали платформы, которые я не предоставляю в этих простых тестах.
Какие улучшения производительности можно __builtin_malloc() обеспечить за счет простого malloc()? Имеет ли __builtin_malloc() зависимость от довольно сложных структур данных, используемых glibc malloc()? Или наоборот, имеет ли glibc malloc()/free() некоторый код для обработки блоков, которые могут быть выделены __builtin_malloc()?
В принципе, как это работает?