Недавно я был ознакомлен с встроенными функциями 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()
?
В принципе, как это работает?