Множество интересных ответов на этот "старый" вопрос, даже несколько относительно новых ответов, но я не нашел ни одного упоминания об этом ....
При правильном и осторожном использовании последовательное использование alloca()
(возможно, в масштабе всего приложения) для обработки небольших распределений переменной длины (или C99 VLA, если они доступны) может привести к меньшему общему росту стека, чем аналогичный реализация с использованием негабаритных локальных массивов фиксированной длины. Так что alloca()
может быть полезным для вашего стека, если вы будете его использовать осторожно.
Я нашел эту цитату в .... Хорошо, я придумал эту цитату. Но на самом деле подумайте об этом ....
@j_random_hacker очень прав в своих комментариях под другими ответами: отказ от использования alloca()
в пользу негабаритных локальных массивов не делает вашу программу более безопасной от переполнения стека (если только ваш компилятор не достаточно стар, чтобы разрешить встраивание функций, которые используют alloca()
, и в этом случае вам следует выполнить обновление, или, если вы не используете alloca()
внутренние циклы, в этом случае вам не следует ... не использовать alloca()
внутренние циклы).
Я работал над настольными / серверными средами и встроенными системами. Многие встроенные системы вообще не используют кучу (они даже не связываются для ее поддержки) по причинам, включающим в себя представление о том, что динамически выделяемая память является злом из-за рисков утечек памяти в приложении, которое никогда не когда-либо перезагружается в течение многих лет, или более разумное оправдание того, что динамическая память опасна, потому что нельзя знать наверняка, что приложение никогда не фрагментирует свою кучу до точки ложного исчерпания памяти. Таким образом, у встроенных программистов остается мало альтернатив.
alloca()
(или VLA) может быть подходящим инструментом для работы.
Я снова и снова видел, как программист делает буфер, выделенный стеком, «достаточно большим для обработки любого возможного случая». В глубоко вложенном дереве вызовов повторное использование этого (анти -?) Шаблона приводит к чрезмерному использованию стека. (Представьте себе дерево вызовов глубиной 20 уровней, где на каждом уровне по разным причинам функция слепо перераспределяет буфер размером 1024 байта «на всякий случай», когда обычно используется только 16 или меньше из них, и только в очень больших количествах. в редких случаях может использоваться больше.) Альтернативой является использование alloca()
или VLA и выделение столько места в стеке, сколько требуется вашей функции, чтобы избежать ненужной нагрузки на стек. Надеюсь, когда одной функции в дереве вызовов требуется выделение большего размера, чем обычно, другие в дереве вызовов по-прежнему используют свои обычные небольшие выделения, а общее использование стека приложения значительно меньше, чем если бы каждая функция слепо перераспределяла локальный буфер .
Но если вы решите использовать _9 _...
Основываясь на других ответах на этой странице, кажется, что VLA должны быть безопасными (они не объединяют выделения стека, если вызываются из цикла), но если вы используете alloca()
, будьте осторожны, чтобы не использовать его внутри цикла, и убедитесь, что ваша функция не может быть встроена, если есть вероятность, что она может быть вызвана в цикле другой функции.
person
phonetagger
schedule
31.03.2016
free
(что, очевидно, является преимуществом), невозможность встроить его (очевидно, что распределение кучи намного тяжелее) и т. Д. Единственная причина избегатьalloca
- это большие размеры. То есть тратить тонны стековой памяти - не лучшая идея, к тому же у вас есть шанс переполнения стека. В этом случае - рассмотрите возможность использованияmalloca
/freea
- person valdo   schedule 02.11.2011global_ptr_var=alloca( rand( get_seed()) % 12345)
перед вызовомactual_main
, это приведет к тому, что вся программа будет работать с (несколько) случайной базой стека. Так что это может быть полезно. - person greggo   schedule 02.05.2017alloca
заключается в том, что стек нельзя фрагментировать, как кучу. Это может оказаться полезным для приложений, работающих в жестком режиме реального времени, или даже для приложений, критически важных для безопасности, поскольку WCRU может быть затем проанализирован статически, не прибегая к настраиваемым пулам памяти с их собственным набором проблем (отсутствие временной локальности, неоптимальный ресурс использовать). - person Andreas   schedule 17.05.2018