Это хорошая идея использовать C99 VLA по сравнению с malloc / free? - PullRequest
18 голосов
/ 21 июня 2010

Это хорошая идея использовать C99 VLA? Когда целесообразно использовать VLA по сравнению с malloc / free? (так как VLA может взорвать стек?)

Ответы [ 5 ]

25 голосов
/ 21 июня 2010

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

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

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

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

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

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

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

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

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

3 голосов
/ 21 июня 2010

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

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

2 голосов
/ 21 июня 2010

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

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

0 голосов
/ 29 апреля 2019

Просто добавив еще один аспект (не прямой ответ, так как malloc / free не задействован, но все еще связан):

//
// File: someheader.h
//
// Description: Some header intended to be usable in C  a n d  C++.
//              (skipping include guards only for brevity!)
//

#ifdef __cplusplus
extern "C"
{
#endif

void f(size_t n, int(*)[n]); // OOPS: not supported by C++...

#ifdef __cplusplus
}
#endif

Так что это не только из-за портирования , но и из-за более общей проблемы совместимости ...

Если вам нужна такая совместимость, вам нужно пропустить VLA.

0 голосов
/ 21 июня 2010

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

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

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

...