Что делает alloca (0) и возвращает на разных платформах? - PullRequest
0 голосов
/ 07 ноября 2011

Возвращает ли alloca() значение NULL, если задан размер 0?

Быстрый поиск показывает, что alloca(0) вызывает сборку мусора в некоторых случаях!но меня больше всего интересует возвращаемое значение.

спасибо

Ответы [ 4 ]

2 голосов
/ 31 января 2017

Реализация alloca в gcc-2.95 выделяет память из кучи, используя сам malloc.В контексте этой реализации alloca (0) эквивалентно: free (/*all the memory that was allocated with alloca when the stack pointer was deaper*/).Вот цитата из комментария в файле alloca.c файла gcc-2.95.

Общая концепция этой реализации состоит в том, чтобы отслеживать все выделенные для выделения блоки и возвращать любые найденныебыть глубже в стеке, чем текущий вызов.Эта эвристика не восстанавливает хранилище, как только оно становится недействительным, но в конечном итоге это будет сделано.

В особом случае alloca (0) восстанавливает хранилище, не выделяя его.Рекомендуется использовать alloca (0) в главном цикле управления и т. Д. Для принудительного сбора мусора.

Кстати, в этой реализации alloca (0) возвращает NULL.

2 голосов
/ 07 ноября 2011

Согласно этой man-странице , alloca выделит память в стеке, и она либо успешно выполнится, либо приведет к аварийному завершению вашей программы.

Теперь, для выделения 0 байтов, вам не нужно беспокоиться о возвращаемом значении: так как есть 0 байтов, нет места для записи, и не имеет значения, возвращено ли значение указателя 0x1234 или NULL в любом случае программа должна аварийно завершить работу.

1 голос
/ 05 декабря 2017

В Windows _alloca(0); возвращает указатель стека (с некоторым фиксированным смещением.) Это может быть необходимо в некоторых исключительных ситуациях, когда код C должен знать регистр ЦП RSP из *Процесс 1005 * (поскольку встроенная сборка не поддерживается для 64-разрядных сборок в Visual Studio.)

Имейте в виду, однако, что при вызове _alloca(0); будет выделено некоторое количество памяти в стеке, поэтому не вызывайте егоон постоянно находится в той же локальной области, в противном случае это может привести к истощению вашего стека и вызвать исключение stack overflow.

В качестве гораздо лучшей альтернативы рассмотрите возможность вызова _AddressOfReturnAddress() intrinsic.

1 голос
/ 07 ноября 2011

Согласно Справочным страницам Linux

Соответствует

Эта функция отсутствует в POSIX.1-2001.

Примечания

Функция alloca () зависит от машины и компилятора.

Таким образом, alloca () 0 элементов размера не является допустимым, но не определено

У меня нет конкретного примера возвращаемого значения, когда размер = 0. Пожалуйста, посмотрите на этот вопрос и «Замечания по версии GNU» по первой ссылке

...