Каковы преимущества и недостатки использования массива структур по сравнению с массивом указателей на структуру? - PullRequest
4 голосов
/ 25 января 2012

Я пытаюсь решить, какой мне следует использовать.

Плюсы указателей на структуры, которые я могу придумать.

  • Меньше места теряется, если вы не используете все элементы вашего массива.
  • Меньше подслушивается при замене элементов массива

Есть еще какие-нибудь "за" / "против" для обеих сторон?

Ответы [ 6 ]

5 голосов
/ 25 января 2012

Есть несколько других отличий в этих подходах:

  • Подход массива указателей уменьшает накладные расходы при изменении размера массива;
  • Подход массива указателей дает вам «пустое» / «неиспользуемое» значение (NULL). Если это семантически допустимо в вашем приложении, то это является преимуществом (вам не нужно самим изменять struct, чтобы выразить это);
  • Подход массива указателей позволяет нескольким элементам массива ссылаться на один и тот же struct, а не на копию. Опять же, это только преимущество, если эта ситуация семантически обоснована для вашего приложения;
  • Подход массива структур обеспечивает большую локальность ссылок (struct близко друг к другу в массиве также близко друг к другу в памяти, что может быть преимуществом производительности в некоторых ситуациях);
  • Для очень большого количества элементов подход массива структур требует большого непрерывного блока памяти, который может быть недоступен, если ваше адресное пространство процесса стало фрагментированным.
4 голосов
/ 25 января 2012

Недостатком использования массива указателей или указателей в целом является:

Указатели (скорее всего) будут связаны с использованием динамического выделения памяти, что подразумевает ручное управление этой динамической памятью.
Динамическое выделение памятинемного медленнее, чем выделение стека.
Кроме того, использование динамической памяти более подвержено ошибкам при использовании.

Сказав, что выбор на самом деле зависит от:

  • Насколько громоздковаши структуры
  • Известно ли количество требуемых структур во время компиляции
  • Как часто вам нужно менять структуры
3 голосов
/ 25 января 2012

Здесь необходимо сделать важное различие: массиву структур необходим непрерывный блок памяти размера sizeof (struct) * n, с другой стороны, массив указателей на структуры, в то время как ему все еще нужна непрерывная память для сам массив, каждая структура не обязательно должна быть рядом с другой, поэтому первой потребуется большой блок памяти, а вторая приведет к большей фрагментации, на ваш выбор.

Кроме того, кто-то упомянул, что проще записать массив структур на диск, это правда, поскольку вам нужно вызывать write только один раз с указателем на первый элемент и sizeof (struct) * n, если вы используете массив указателей, которые вы должны зациклить и записать каждый элемент отдельно.

Редактировать: и, конечно, вам нужно будет выделить каждую структуру в цикле для массива указателей. Надеюсь, это поможет.

2 голосов
/ 25 января 2012

Если вам нужно записать данные на диск или отправить их в сокет, или поместить их в общую память (все очень распространенные задачи во встроенных приложениях реального времени), массив может быть немного проще.

И массивы избегают использования malloc(). Но им часто требуется realloc(),, что, как указывает caf, может быть проблемой, если массив большой и пространство памяти фрагментировано. Конечно, realloc() не применимо к массивам в .bss, или в .text. Я с нетерпением жду других ответов. Хороший вопрос.

1 голос
/ 25 января 2012

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

Использование массива указателей для доступа к структурам во многих случаях потребует дополнительного шага поиска в таблице для каждого доступа к структуре, тогда как использование массива структур потребует дополнительной операции умножения. На многих более новых архитектурах умножения дешевле, чем поиск в таблицах, но на некоторых небольших или старых архитектурах верно обратное. Кроме того, некоторые меньшие или более старые архитектуры могут иметь проблемы с объектами, которые выходят за определенные границы памяти. Выделение массива из восьми 20-байтовых указателей структуры может быть возможным даже в архитектуре, где было бы невозможно выделить массив из более чем 80 байтов.

1 голос
/ 25 января 2012

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

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

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