Действительно ли это - хорошая идея использовать C99 VLA по сравнению с malloc/free?

Действительно ли это - хорошая идея использовать C99 VLA? Когда уместно использовать VLA по сравнению с malloc/free? (так как VLA может аварийно завершить стек?)

19
задан Ciro Santilli 新疆改造中心法轮功六四事件 23 April 2016 в 07:42
поделиться

4 ответа

Да, за исключением случаев, когда вы знаете, что ваш стек может взорваться. Вы также можете изменить размер стека, если это необходимо, это по-разному для каждой ОС, но это возможно. Преимущества VLA:

  • Быстрая: настройка указателя стека и / или указателя кадра в любом случае была бы выполнена, поэтому стоимость VLA составляет почти 0.

  • Легко: простое определение, нет указателя для инициализации, чтобы проверить, чтобы не было утечки памяти.

  • Это автоматически потокобезопасность, поскольку каждый поток имеет свой собственный стек. Он также имеет лучшее масштабирование, поскольку нет необходимости в блокировке, одна проблема может возникнуть при использовании malloc / free .

  • Удобочитаемость: это действительно простая концепция, поэтому с меньшей вероятностью появятся тонкие ошибки.

У него есть некоторые недостатки:

  • Ограниченный размер: как уже было сказано, стек может взорваться.

  • Переполнение буфера немного серьезнее, чем в динамической памяти (можно утверждать, что это преимущество, поскольку аварийное приложение лучше, чем приложение, которое незаметно повреждает данные и в конечном итоге дает сбой по несвязанным инструкциям).

  • Переносимость: не все компиляторы реализуют это, но часто это можно смоделировать с помощью alloca (внимание, семантика немного отличается, но ничего серьезного).

26
ответ дан 30 November 2019 в 04:03
поделиться

C ++ не поддерживает VLA. Так что портировать код на C ++, если возникнет такая необходимость, потребует немного больше усилий.

С другой стороны, некоторые считают, что это действительно хорошая вещь, и хитро предлагают «класс» в качестве прекрасного имени для символа в c: -)

2
ответ дан 30 November 2019 в 04:03
поделиться

Хороший список ссылок, связанных с C99 (включая ссылки на информацию о массивах переменной длины), см. В:

Xcode теперь по умолчанию использует C99 - так что же C99?

http://lists.apple. com / archives / xcode-users / 2008 / May / msg00665.html

0
ответ дан 30 November 2019 в 04:03
поделиться

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

Далее я буду настаивать на том, что вы должны использовать VLA постоянно, когда это возможно, а malloc - только если: Вам нужно контролировать длительность хранения, и если у вас очень большие выделения, и если вы хотите изящно обрабатывать ошибки вне памяти.

3
ответ дан 30 November 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: