Что такое применение alloca?
Возможный дубликат:
В каких случаях полезно использовать alloca()?
Недавно мне довелось увидеть использование функции alloca(). Поиск в Google сказал мне, что он используется для выделения места в стеке. Я не могу получить заявку на это? Кроме того, есть ли подводные камни в использовании этого?
2 ответа
Функция alloca
никогда не был частью какого-либо стандарта C. Как правило, поставщики поставляют его как расширение для достижения чего-то вроде массивов переменной длины ("VLA") в C99:
void foo(int n)
{
char arr99[n]; // C99-style VLA
char * p89 = alloca(n); /* C89 work-around using "alloca" */
// Usage:
for (int i = 0; i != n; ++i)
{
arr99[i] = p89[i] = '0' + i;
}
} // memory is freed automatically here
В обоих случаях память автоматически управляется и освобождается в конце функции.
Использование alloca
мысленно обременителен, поскольку не совсем подходит для объектной модели C. Например, даже если вы выделяете память во вложенной области, она остается активной до конца включающей функции, а не только для блока. VLA имеют гораздо лучшую семантику и могут запрашиваться динамически sizeof
в то время как нет эквивалентного механизма для alloca
Распределенная память.
Это удобно, когда вы хотите сделать динамически выглядящее выделение (используя, например, размер, который изменяется во время выполнения), но все же будьте уверены, что все это будет очищено после того, как код, который вызывает alloca()
выходит за рамки.
Как и все автоматические ("стековые") распределения, вам будет больно, если вы случайно сохраните указатели дольше, чем они действительны.