Что такое применение 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() выходит за рамки.

Как и все автоматические ("стековые") распределения, вам будет больно, если вы случайно сохраните указатели дольше, чем они действительны.

Другие вопросы по тегам