Каков наилучший способ выделить память для переменных в структуре? - PullRequest
1 голос
/ 21 июля 2011

Например, у меня есть эта структура и код:

typedef struct
{
long long *number;
} test;

test * test_structure;
test_structure = malloc(sizeof(test));
test_structure->number = malloc(sizeof(long long) * 100);
free(test_structure->number);
free(test_structure);

против этой структуры и кода:

typedef struct
{
long long number[100];
} test;

test * test_structure;
test_structure = malloc(sizeof(test));
free(test_structure);

Так как я знаю, что массив чисел ВСЕГДА будет 100,любой из этих методов вполне приемлем, или один из способов лучше другого, и почему?

Ответы [ 3 ]

6 голосов
/ 21 июля 2011

Второй способ лучше по нескольким причинам:

  1. Вы должны освободить только одно выделение, а не два (уменьшена вероятность утечки памяти).
  2. Вы закодировали размермассива в структуре данных, и это может помочь с анализом кода.Первая версия может иметь любой размер, и никто не может сказать, что любой индекс неверен.Если вы добавили элемент 'size', который был соответствующим образом инициализирован в первой структуре, в этом аргументе было бы меньше силы, но не намного меньше силы.
  3. Вы можете скопировать всю вторую структуру с помощью присвоения структуры;вы не можете скопировать первую структуру таким же образом.
  4. Сгенерированный ассемблер немного отличается (длиннее) для первого (он должен извлечь адрес из члена, затем разыменовать его, а не просто разыменовыватьсо вторым).

С учетом всего сказанного, два метода практически одинаковы.Вы используете (мне хотелось сказать «впустую», но это не совсем справедливо) больше места с первым, но это вряд ли будет серьезной проблемой (и если бы это было так, вы, вероятно, захотите изменить размер от100, так как это сэкономит вам больше места, чем работа с указателем и массивом).

3 голосов
/ 21 июля 2011

Я бы определенно пошел на последнее. Профиль памяти будет практически идентичен. Имея всего одно выделение памяти и, следовательно, меньшее количество движущихся частей, которые нужно отслеживать, практически нет оснований рассматривать первую альтернативу.

На самом деле, даже для массива неизвестной длины, я бы, вероятно, выбрал бы голый long long *, а не обертку структуры, которая, кажется, не добавляет значения.

0 голосов
/ 21 июля 2011

Я использую последнее ТОЛЬКО потому, что вы говорите, что знаете размер массива. Если нет, то бывший.

...