Когда использовать массив переменной длины (VLA)?

  • malloc работает медленно и размещает память в куче. Подходит для больших объектов или объекты, время жизни которых должно быть продлено за пределы функции где они создаются.
  • статическое размещение находится в стеке. Распределение, запеченное компилятором так что, по сути, свободное время. Хорошо подходит для мелких предметов. Риск SO в противном случае.

Короче говоря, я придерживаюсь этих правил, чтобы решить, как распределять блоки памяти.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Автоматические VLA обычно не очень полезны, но у типов VM есть несколько применений:

  • Проверка размера при передаче массива в функцию
#include <stdio.h>

void f(const size_t size, const int buf[static size]);

int main(void)
{
    int arr[50] = { 0 };
    f(10, arr);  // acceptable
    f(50, arr);  // correct
    f(100, arr); // *WARNING*
    return 0;
}
  • Выделение многомерных массивов одним вызовом malloc()
// `n` and `m` are variables with dimensions
int (*arr)[n][m] = malloc(sizeof *arr);
if (arr) {
    // (*arr)[i][j] = ...;
    free(arr);
}

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

chux - Reinstate Monica 21.04.2023 17:37

@chux-ReinstateMonica Действительно, C23 потребует поддержки типов виртуальных машин, в то время как автоматический VLA останется необязательным.

Jorengarenar 21.04.2023 17:39
Ответ принят как подходящий

Я не могу придумать хорошего использования VLA во встроенном пространстве. Мне трудно придумать хорошее применение в пространстве приложений.

Я использовал их в прошлом в качестве рабочего хранилища при токенизации или манипулировании строками:

void tokenize( const char *str )
{
  /**
   * Copy input string to temporary buffer and tokenize
   * that buffer, leaving the original string unmolested
   */
  char tmp[strlen( str )+1];
  strcpy( tmp, str );
  char *tok = strtok( tmp, " " );
  while ( tok )
  {
    // do something interesting with the token
    tok = strtok( NULL, " " );
  }
}

Но это не то, что я делал так часто.

Другие вопросы по теме