7.3 Встроенные функции для выделения памяти в стеке
-
Встроенная функция:
void *__builtin_alloca(size_t size) -
Функция
__builtin_allocaдолжна вызываться в области блока. Функция выделяет на стеке вызывающей функции объект размером size байт. Объект выравнивается по границе выравнивания стека по умолчанию для целевой платформы, определяемой макросом__BIGGEST_ALIGNMENT__. Функция__builtin_allocaвозвращает указатель на первый байт выделенного объекта. Срок жизни выделенного объекта заканчивается непосредственно перед возвратом вызывающей функции в вызывающую её функцию. Это справедливо и в том случае, когда__builtin_allocaвызывается внутри вложенного блока.Например, следующая функция выделяет в стеке восемь объектов по
nбайт каждый, сохраняя указатель на каждый из них в последовательных элементах массиваa. Затем она передаёт массив функцииg, которая может безопасно использовать память, на которую указывает каждый элемент массива.void f (unsigned n) { void *a [8]; for (int i = 0; i != 8; ++i) a [i] = __builtin_alloca (n); g (a, n); // safe }Поскольку функция
__builtin_allocaне проверяет свой аргумент, вызывающая её сторона должна убедиться, что значение аргумента не приведёт к превышению ограничения размера стека. Функция__builtin_allocaпредназначена для выделения в стеке массивов байтов с верхней границей размера, которая может вычисляться во время выполнения. Поскольку массивы переменной длины C99 обеспечивают аналогичные возможности через переносимый, более удобный и безопасный интерфейс, рекомендуется использовать их в программах на C99 и C++, где GCC предоставляет их в качестве расширения. Подробности см. в разделе Массивы переменной длины.
-
Встроенная функция:
void *__builtin_alloca_with_align(size_t size, size_t alignment) -
Функция
__builtin_alloca_with_alignдолжна вызываться в области блока. Функция выделяет на стеке вызывающей функции объект размером size байт. Выделенный объект выравнивается по границе, заданной аргументом alignment, единицей измерения которого являются биты (не байты). Аргумент size должен быть положительным и не превышать ограничение размера стека. Аргумент alignment должен быть целочисленным константным выражением, результатом вычисления которого является степень двойки, большая или равнаяCHAR_BITи меньшая некоторого неуказанного максимума. Вызовы с другими значениями отклоняются с ошибкой, указывающей допустимые границы. Функция возвращает указатель на первый байт выделенного объекта. Срок жизни выделенного объекта заканчивается в конце блока, в котором была вызвана функция. Выделенная память освобождается не позднее момента непосредственно перед возвратом вызывающей функции в вызывающую её функцию, но может быть освобождена в конце блока, в котором была вызвана функция.Например, в следующей функции вызов
gнебезопасен, поскольку при ненулевом значенииoveralignпамять, выделенная с помощью__builtin_alloca_with_align, могла быть освобождена в конце оператораif, в котором он был вызван.void f (unsigned n, bool overalign) { void *p; if (overalign) p = __builtin_alloca_with_align (n, 64 /* bits */); else p = __builtin_alloc (n); g (p, n); // unsafe }Поскольку функция
__builtin_alloca_with_alignне проверяет свой аргумент size, вызывающая её сторона должна убедиться, что значение аргумента не приведёт к превышению ограничения размера стека. Функция__builtin_alloca_with_alignпредназначена для выделения в стеке массивов байтов с увеличенным выравниванием и верхней границей размера, которая может вычисляться во время выполнения. Поскольку массивы переменной длины C99 обеспечивают те же возможности через переносимый, более удобный и безопасный интерфейс, рекомендуется использовать их в программах на C99 и C++, где GCC предоставляет их в качестве расширения. Подробности см. в разделе Массивы переменной длины.
-
Встроенная функция:
void *__builtin_alloca_with_align_and_max(size_t size, size_t alignment, size_t max_size) -
Аналогична функции
__builtin_alloca_with_align, но принимает дополнительный аргумент, задающий верхнюю границу для size на случай, если его значение не может быть вычислено во время компиляции. Этот аргумент используется параметрами -fstack-usage, -Wstack-usage и -Walloca-larger-than. max_size должен быть целочисленным константным выражением; он не влияет на генерацию кода, и его совместимость с size не проверяется.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Stack-Allocation.html