Ручки против умных указателей. Что использовать? - PullRequest
0 голосов
/ 17 июля 2011

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

С моей точки зрения:

  • Плюсы умных указателей: созданные по требованию, у них нет проблемы стать устаревшими указателями; минусы: поскольку они находятся в связанном списке, поиск указателя является операцией O (n).

  • Обрабатывает плюсы: поиск - O (1), перемещение объекта - O (1); cons: can стал устаревшим указателем, создание нового дескриптора заставляет систему проверять наличие первой записи NULL в таблице дескрипторов.

Какой из них выбрать? Пожалуйста, объясните ваш выбор.

РЕДАКТИРОВАНИЕ:

Я хочу уточнить некоторые моменты после ваших комментариев и ответов.

Я не имею в виду, что умные указатели являются связанным списком в виде «представлены связанным списком STL». Я имею в виду, что они ведут себя, в некотором смысле, как связанный список (если вы перемещаете один объект из одного блока памяти в другой, вам нужно перебрать полный список интеллектуальных указателей, чтобы правильно обновить все ссылки на этот объект - это можно сделать с помощью связанный список -).

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

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Ни одно из этих определений не соответствует тому, что обычно используется. Умные указатели вообще не включены в связанный список. Обычно вы используете шаблон наблюдателя, чтобы сохранить вектор необработанных указателей на объекты, которые все еще существуют, если вам нужно повторить их или что-то еще. Дескрипторы, которые вы описываете, в значительной степени используются только в целях двоичной совместимости и никогда не выполняются.

Используйте умные указатели, они заботятся о себе.

1 голос
/ 17 июля 2011

Термин «дескриптор» - это широкий термин, который, по сути, означает идентификатор объекта .

Указатель или умный указатель подпадают под это определение, поэтому вам нужно выбратьболее краткий термин для вашего Варианта 2.

             "Handle"
                 |
          /------+-------\
         /       |         \
        /        |           \
    Pointer    Reference    Other Identififer
       |         |             \
  |----+----|   `T&`             \
  |         |                 |---+------|
 `T*`  `shared_ptr<T>`      Text       Number (e.g. HWND in WinAPI)

Если я предполагаю, что вы имеете в виду некоторый фиксированный абстрагированный от памяти "другой идентификатор", тогда, конечно, вы можете использовать это.У вас не обязательно есть либо / или сценарий здесь.Вы, вероятно, хотите использовать умные указатели в любом случае (для управления жизненным циклом, если ничего больше), а умным указателям не нужно , чтобы быть в связанном списке.

может иметь std::map<your_identifier_type, std::shared_ptr<T> > для сопоставления вашего фиксированного пользовательского идентификатора с [потенциально изменяющимся] умным указателем.


Отказ от ответственности: Эта диаграмма была спешно нарисованаи представляет мое видение дерева терминологии в его нынешнем виде, через полчаса после вставания с постели.Могут быть незначительные расхождения с другими взглядами, но это должно дать достаточно надежное представление о вещах.

...