Правильно ли я использую указатели в этой C-реализации A *? - PullRequest
0 голосов
/ 27 апреля 2011

Чтобы лучше понять C и попытаться улучшить производительность приложения, которое я создаю для iOS, я решил реализовать поиск пути в C.

Код доступен здесь

В коде я создаю и использую следующие структуры:

  • Узел: это вершина графа, она имеет координаты и некоторые другие связанные данныеA *
  • NodeGraph: коллекция узлов
  • NodeHeap: куча, которая используется для открытого списка (приоритетная очередь)

NodeGraph отвечает зауправление памятью узла;все остальное, что требует доступа к узлу, использует указатель на конкретный узел в NodeGraph.Например, NodeHeap - это просто набор указателей Node, таких как:

// graph is NodeGraph* created elsewhere
Node* n = &(graph->nodes[x][y]);
// heap is a Nodeheap* created elsewhere
heap[0] = n;

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

Это то, как я должен делать что-то подобное в C?Существуют ли какие-либо конструкции C, которыми я не пользуюсь, или что-то еще, чего я полностью упускаю?

1 Ответ

0 голосов
/ 18 мая 2011

В большинстве систем распределение памяти обходится дорого, потому что ваш процесс должен взаимодействовать (и, следовательно, ждать) с ОС. Как правило, это не относится к бесплатной ситуации, которая не возвращает память операционной системе, а вместо этого сохраняет ее для вас и использует ее преимущественно для будущих вызовов функций * alloc.

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

Я предлагаю написать свой код без оптимизации, а затем использовать профилировщик (например, gprof), чтобы увидеть, на что вы тратите больше всего времени. Затем вы можете оптимизировать свой код соответственно.

...