Чтобы получить лучшую производительность и лучшую читаемость, такие массивы, всегда должны быть выделены в виде непрерывного куска памяти:
type (*array) [X][Y] = malloc(sizeof(type[X][Y]));
Следует избегать этого:
// BAD METHOD, not a real array
type** lookup_table = malloc(X*sizeof(type*));
for(size_t i=0; i<Y; i++)
{
lookup_table[i] = malloc(Y*sizeof(type));
}
Бывший быстрее по многим причинам. Он выделяется в непрерывном куске памяти и не сегментируется по всей куче. Сегментированные версии блокируют все формы оптимизации кода и эффективное использование кэша данных на чипе, а также фактическое распределение также намного медленнее.
«Плохая» версия выше имеет одно преимущество, хотя это означает, что вы хотите, чтобы отдельные размеры имели переменную длину, например, при создании таблицы поиска для строк. Затем вы должны использовать эту форму. Но если вам нужен настоящий 2D-массив, никогда не будет причины не использовать его.
Обратите внимание, что первая версия обычно записывается как
type (*array) [Y] = malloc(sizeof(type[X][Y]));
, чтобы обеспечить более удобное использование: array[i][j]
, а не менее читаемым (*array)[i][j]
.
Какая у вас информация о размере? Является ли он исправленным или он изменится при запуске программы? –
двухмерный массив будет быстрее выделяться, потому что только 1 выделение, также смежное. Но если вы попросите слишком много смежных, это может потерпеть неудачу. –