2011-07-17 2 views
0

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

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

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

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

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

Редакция:

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

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

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

+4

Можете ли вы подробно остановиться на том, что именно вы имеете в виду, когда используете термин «ручка»? –

+1

Кроме того, что именно вы подразумеваете под «поиском указателя», и почему вы говорите, что умные указатели хранятся в связанном списке? – interjay

+0

@davidcm: Обычно 'handle' означает непрозрачную сущность (возможно, указатель), которая используется как идентификатор после первого начального вызова, чтобы открыть устройство или файл и т. Д. Не уверен, что за« дескриптор »вы имеете в виду Вот. –

ответ

2

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

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

1

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

указатель или смарт-указатель попадает под это определение, так что вы должны выбрать terser срок для варианта 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> >, чтобы сопоставить фиксированный, определяемый пользователем идентификатор с помощью [потенциально изменяющегося] умного указателя.


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

Смежные вопросы