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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

И снова некоторые считают, что это на самом деле хорошая вещь и хитро предлагаю "класс" как замечательное имя для символа в c: -)

Ответ 4

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

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

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

Ответ 5

Просто добавив еще один аспект:

//
// 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.