Динамическое распределение 2D-массивов в C - PullRequest
2 голосов
/ 20 августа 2010

Как мне разместить динамические массивы в C?В настоящее время у меня есть функция, которую я написал, под названием malloc2D, которая выглядит следующим образом:

void* malloc2D(size_t unitSize, uint firstCount, uint secondCount)
{
    void** pointer = malloc(sizeof(id) * firstCount);
    for (int i =0; i < firstCount; i ++){
        pointer[i] = malloc(unitSize * secondCount);
    }
    return pointer;
}

Она отлично работает, однако мне сказали, что это сильно напрягает выделение памяти отдельно.Какой самый лучший или самый обычный способ сделать это?

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

Вы можете выделить весь блок сразу:

int ** foo;

foo = malloc(sizeof(int*) * firstCount);
foo[0] = malloc(sizeof(int) * firstCount * secondCount);
for (int i=1; i<firstCount; i++)
{
    foo[i] = foo[0] + i * secondCount;
}
3 голосов
/ 20 августа 2010

Мое предложение было бы сохранить то, что у вас есть.

  1. Он уже разработан.
  2. Проверено.
  3. Интуитивно понятный / читаемый без использования макроса.
  4. Это расширяемое.
  5. Узких мест количественно не выявлено.

Иногда попытки оптимизировать, когда нет проблем, могут снизить производительность. Делали ли вы какие-либо тесты против теории своих друзей?

malloc Большой кусок требует размещения смежного адресного пространства и может даже привести к сбою malloc при успешном выполнении текущего метода ( фрагментация адресного пространства и т. Д.).

Когда я сказал, что ваша текущая реализация расширяема, я имею в виду, что изменение размера тривиально. Если вы выделите [100] [3] и позже поймете, что вам нужно [100] [4], то все, что вам нужно сделать, это 100 очень маленьких перераспределителей, вероятно, не меняющих адреса. Однако, если макро-метод требует изменения размера, вам нужно realloc весь кусок, который может не существовать непрерывно. Что еще хуже, данные больше не находятся в нужном месте для доступа к макросу, потому что математика изменилась, поэтому вам понадобится серия дорогих memmove s.

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

0 голосов
/ 15 сентября 2015

Вы можете выделить массив как непрерывный блок, как это.Предположим, вам нужны целые числа:

int (*arr)[secondCount] = malloc( sizeof(int[firstCount][secondCount]) );

Вы можете спрятать это за макросом, который принимает имя типа в качестве аргумента макроса, хотя код достаточно прост, и в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...