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





Автоматические 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-ReinstateMonica Действительно, C23 потребует поддержки типов виртуальных машин, в то время как автоматический VLA останется необязательным.
Я не могу придумать хорошего использования 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, " " );
}
}
Но это не то, что я делал так часто.
Комментарии перемещены в чат ; пожалуйста, не продолжайте обсуждение здесь. Прежде чем публиковать комментарий под этим, пожалуйста, ознакомьтесь с целями комментариев . Комментарии, которые не требуют разъяснений или предложений по улучшению, обычно относятся к ответу , к Meta Stack Overflow или в чату переполнения стека. Комментарии, продолжающие обсуждение, могут быть удалены.