Вопрос

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

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

Это было полезно?

Решение

это известно о внутренних интернатах shared_ptr,

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top