Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API