ALLOCA(3) | Руководство программиста Linux | ALLOCA(3) |
alloca - выделяет память, которая будет высвобождена автоматически
#include <alloca.h>
void *alloca(size_t size);
Функция alloca() выделяет size байтов памяти в стековом кадре вызывающего. Это временное хранилище данных автоматически освобождается после возврата из функции, вызвавшей alloca().
Функция alloca() возвращает указатель на начало выделенной памяти. Если выделение памяти привело к переполнению стека, то дальнейшее поведение программы не определено.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
alloca() | Безвредность в нитях | MT-Safe |
Данная функция отсутствует в POSIX.1.
Очевидно, что данная функция alloca() существует в 32V, PWB, PWB.2, 3BSD и 4BSD. Это можно понять по наличию соответствующей справочной страницы в 4.3BSD. В Linux используется версия GNU.
Работа функции alloca() зависит от машины и компилятора. В некоторых приложениях её использование может повысить эффективность (если сравнивать с malloc(3) плюс free(3)). В определённых случаях она также может упростить высвобождение памяти в приложениях, использующих longjmp(3) или siglongjmp(3). Но лучше её не использовать.
Так как пространство, выделяемое alloca(), берётся из стекового кадра, то оно автоматически освобождается, когда возврат из функции производится вызовом longjmp(3) или siglongjmp(3).
Пространство, распределённое alloca(), автоматически не освобождается, если указатель, который на него ссылается, просто выходит из обращения.
Не пытайтесь освободить место, выделенное alloca(), с помощью free(3)!
Обычно, gcc(1) встраивает код alloca() в место вызова. Это не делается, если был указан параметр -ansi, -std=c89, -std=c99 или -std=c11 и заголовочный файл <alloca.h> не включается. В противном случае (без параметра -ansi или -std=c*) версия glibc файла <stdlib.h> включает <alloca.h>, который содержит строки:
#ifdef __GNUC__ #define alloca(size) __builtin_alloca (size) #endif
что приводит к множеству неприятных последствий, если у кого-то есть своя версия этой функции.
Тот факт, что код встраивается, означает, что будет невозможно получить адрес этой функции или изменить её поведение посредством компоновки с другой библиотекой.
Встраиваемый код часто представляет собой одну инструкцию, корректирующую указатель стека и не отслеживающую переполнение стека. Поэтому при ошибке невозможно получить NULL.
Если стековый кадр не может быть расширен, то никакой ошибки также не возвращается (однако, после неудачного выделения программа, вероятно, получит сигнал SIGSEGV при попытке доступа к не выделенному пространству).
Во многих системах alloca() не может быть использована в списке аргументов вызова функции, так как пространство под стек, зарезервированное alloca(), возникло бы между аргументами функции.
2019-03-06 | GNU |