Насколько широко используется alloca
в реальном мире? Должен ли я учить своих учеников использовать, alloca
когда это имеет смысл? Или я должен научить их никогда не использовать это? Исходя из C ++ RAII, идея о том, что нет необходимости вызывать free
вручную, звучит многообещающе, особенно в функциях с несколькими точками выхода.
18
malloc
.Ответы:
Если вы проводите курс по общему программированию на C, вы не должны учить их тому , чего нет в стандарте. Программисты-новички без необходимости писать нестандартный и / или непереносимый код, потому что их учили таким образом, были огромной проблемой для индустрии программного обеспечения в течение последних 20-30 лет или около того. Цена за то, что они не обучают их стандарту и ничего, кроме стандарта, скорее всего астрономическая.
Если вы проводите более продвинутый курс по алгоритмам или прикладному программированию, было бы неплохо упомянуть об этом. С другой стороны, я программировал все, от жестких встроенных приложений реального времени до пуха приложений Windows, в течение 15 лет, никогда не используя эту функцию.
источник
Я вижу, что происходит две вещи:
Студенты понимают влияние
alloca
, читают о различиях между стеком и кучей, и используютalloca
внимательно. (вряд ли)Ученики думают: «Ничего себе, это как будто
malloc
не беспокоясь оfree
», используйте его чрезмерно, получайте переполнение стека и понятия не имеете, в чем дело.Я думаю, что гораздо лучше, если вы опишите
alloca
, а затем запустите этот код:Источник: http://www.strchr.com/alloca
покажи им опасности, а потом скажи им не использовать это. Они все равно узнают о стеке и куче, увидят опасности в действии и смогут двигаться дальше со стандартными вещами.
источник
_alloca
а неalloca
? И почему это дает результат?Ответ на этот вопрос должен быть основан на том, что ваши цели в первую очередь.
Вы хотите научить кого-то, кто уже знает, как программировать, как писать C и работать с существующим кодом C в дикой природе? Если это так, расскажите о alloca и обо всем, что вы хотите.
С другой стороны, если вы преподаете вводный курс, в котором по совпадению используется только C (а язык C очень маленький и т. Д.), Вам следует сосредоточиться на важных частях (написание модульных программ, подпрограмм, сборников и т. Д.). .). С точки зрения студента, alloca является излишним, так как malloc достаточно в большинстве случаев, и с точки зрения хорошего кода вам лучше явно упомянуть, как ручное управление памятью раздражает и как другие языки справляются с этой проблемой. В конце концов, есть больше что-то для управления памятью, затем alloca или RAII, так что вы действительно не должны ограничивать себя этим, и, как вы уже упоминали, гораздо проще понять назначение alloca, если вы сравните его с другими «более стандартными» способами делать вещи на других языках. (или C99 ...)
источник
Нет.
Единственная причина, по которой программист C должен знать о существовании alloca, - это понимать и исправлять унаследованный код, который его использует.
Любое использование
alloca
либоПомимо нескольких мысленных экспериментов, для которых я никогда не находил реальных примеров, не существует ни
alloca
одного варианта использования (или VLA), который не был бы ни бесполезным, ни уязвимым (один из двух вышеупомянутых случаев).источник
alloc
100% эквивалентно автоматическим массивам фиксированного размера и менее переносимо.T foo[5000];
или что-то еще.std::mutex
, я мог бы вызвать вызов ядра и переключение контекста для пяти тысяч мьютексов. Не дешево. Не говоря уже о дополнительной стоимости кэша размещения локальных переменных после массива.Мое мнение таково: не поощряйте его использование, если вы не обучаете принципам низкоуровневого компилятора, используемым для выделения стекового пространства для локальных переменных. Научите этому в этом контексте.
источник
В документации GCC есть пара практических плюсов и минусов
alloca()
. С практической точки зрения, приличное количество свободного программного обеспечения использует его, поэтому хорошо понимать, как оно работает и где оно используется в существующем коде.Передача
-Wl,-stack=
new-stack-size в gcc увеличивает максимальный размер стека; вам нужно будет это сделать, если ваш проект используетalloca()
или выделяет большие временные массивы, или использует рекурсию за пределами определенной контекстно-зависимой глубины.источник