Когда использовать указатели C ++ в разработке игр - PullRequest
4 голосов
/ 03 марта 2012

Я просмотрел кучу статей, и большинство из них рассказывают одну и ту же историю: не используйте указатели, если это не нужно. Исходя из C # / Java-фона, где вся память управляется, я абсолютно не знаю, когда уместно использовать указатель, за исключением следующих ситуаций:

  • динамическая память (например, массивы переменного размера)
  • полиморфизм

Когда еще я буду использовать указатели, особенно в контексте gamedev?

Ответы [ 4 ]

6 голосов
/ 03 марта 2012

«Не используйте указатели, они медленные» не имеет смысла (по крайней мере, не в C ++).

Это все равно, что сказать, «Не используйте переменные, они медленные» .

  • Вы имели в виду «Не использовать динамическое выделение памяти «?
    Если так: я не думаю, что вам стоит беспокоиться об этом прямо сейчас.Сначала напишите код, а затем оптимизируйте.

  • Или вы хотели сказать: «Не используйте raw указатели (т.е. типа foo*)», что потребует new и delete?
    Если это так, то это хороший совет : обычно вы хотите умных указателей вместо этого, например shared_ptr или unique_ptr, чтобы управлять объектами, а не иметь дело с необработанными указателями.Вам не нужно использовать new и delete в большинстве кода C ++, хотя это может показаться естественным.
    Но они все еще указатели под капотом!

  • Или вы имели в виду что-то еще?

Приложение

Спасибо @ bames53 ниже за указание на это:

При прохожденииопция копирования (т. е. когда вы передаете небольшие объемы данных, а не огромную структуру или массив, который может быть больше нескольких регистров, например, порядка ~ 16 байт), не использовать указатели (или ссылки) для передачи данных;вместо этого передайте копию.Это позволяет компилятору оптимизировать таким образом.

3 голосов
/ 03 марта 2012

Одно из основных применений указателей (хотя ссылки обычно лучше, когда это возможно), - возможность передавать объект без копирования его. Если объект содержит много данных, его копирование может быть довольно дорогим и ненужным. С точки зрения разработки игр, вы можете хранить указатели в контейнере, например std::vector, чтобы вы могли управлять объектами в игре. Например, у вас может быть вектор, содержащий указатели на всех врагов в игре, чтобы вы могли выполнить с ними некоторую «массовую процедуру». Возможно, стоит также изучить интеллектуальные указатели , поскольку они могут значительно облегчить вашу жизнь (они очень помогают в предотвращении утечек памяти).

2 голосов
/ 03 марта 2012

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

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

1 голос
/ 03 марта 2012

Вам не нужны указатели для массивов переменного размера, вы можете (и обычно должны) использовать std::vector вместо этого.Вам не нужны сырые указатели для полиморфизма;виртуальные функции работают с такими умными указателями, как unique_ptr.

. В современном C ++ вам редко нужны указатели.Часто они будут скрыты внутри классов, владеющих ресурсами, таких как векторы.Чтобы передавать объекты без копирования, вы можете использовать ссылки.Большинство оставшихся указателей используются интеллектуальными указателями.Очень редко вам понадобится указатель «не владеющий», и в этом случае с необработанными указателями все в порядке.

Вы узнаете, как правильно использовать указатели, если узнаете, что следует использовать вместо указателей.Так что узнайте о RAII, ссылках и smart_pointers.

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