Коллекция специализированная для shared_ptr - PullRequest
5 голосов
/ 05 июня 2009

Существует ли коллекция, которая осведомлена о внутренних ресурсах shared_ptr и избегает регулярного копирования хранимых элементов shared_ptr в пользу простого копирования их внутреннего слабого указателя?

Это неявно означает, что вызовы конструктора / деструктора не будут выполняться и что не будет никаких манипуляций со счетчиками ссылок shared_ptrs.

Ответы [ 2 ]

9 голосов
/ 05 июня 2009

Теоретически, после принятия C ++ 0x контейнеры будут модифицированы для использования семантики перемещения, где это уместно. В этот момент shared_ptr также можно изменить, чтобы иметь конструктор перемещения, чтобы минимизировать ненужную настройку счетчика ссылок.

3 голосов
/ 05 июня 2009

, который знает о внутренних ресурсах shared_ptr,

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

Это действительно обратная сторона умных указателей. Я бы порекомендовал использовать структуры данных, которые ограничивают количество внутренних копий. Перераспределение вектора будет болезненным. Возможно, будет полезен deque, который имеет выделение по частям. Имейте также в виду, что векторные реализации имеют тенденцию получать новую память экспоненциально увеличивающимися частями. Таким образом, они не перераспределяют, скажем, каждые 10 элементов. Вместо этого вы могли бы начать с 128 элементов, затем вектор резервирует себя 256, затем поднимается до 512, 1024 и т. Д. Каждый раз, удваивая необходимое.

Если не считать этого, есть метод ptr_vector boost или предварительное распределение структур данных с достаточным пространством для предотвращения внутреннего копирования.

...