2016-07-09 2 views
2

Я столкнулся с выбором дизайна для отдельного класса списка. Грубая идея заключается в следующей:Уменьшить количество shared_ptrs в постоянной структуре данных

template<typename T> 
class List { 
public: 
    ... 

private: 
    struct Node { 
     std::shared_ptr<const T> value; 
     std::shared_ptr<const Node> next; 
    }; 

    std::shared_ptr<const Node> node_; 
}; 

Да, я знаю, что есть много shared_ptr с блуждающим вокруг, но это потому, что List является функциональной настойчивой структурой данных, которая должна как можно больше структурного обмена, насколько это возможно. В этой реализации, например, для реверсирования списка не требуется копировать какие-либо элементы, а несколько списков могут совместно использовать общий под-список (указывая на один и тот же хвост shared_ptr).

Это, как говорится, я все еще чувствую, что, возможно, слишком много shared_ptr. Есть ли все-таки, чтобы уменьшить количество используемых shared_ptr s, все еще поддерживая структурное разделение? Что-то вроде сочетания двух shared_ptr s внутри Node, чтобы уменьшить накладные расходы блоков управления ... Я не знаю, может быть, нет пути, а может быть, есть. Любая идея приветствуется, даже о переделке всего класса List.

+3

Не может ли узел инкапсулировать T? –

+0

@ RichardHodges Можете ли вы рассказать? –

+0

Почему не простой член 'T'? –

ответ

2

Вы хотите обмениваться данными без структуры (обратный регистр).

Вы хотите поделиться структурой.

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

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

Сделать указатель-to-T необработанным указателем.

Создайте объединенную структуру с T и узлом в ней.

Используйте make_shared, чтобы создать его.

Теперь сделайте указатель-T-точку T на объединенной структуре.

Далее, используйте псевдоним ctor для создания общего ptr для узла, совместно использующего блок управления объединенной структуры.

Чтобы перестроить, создайте вспомогательную структуру с узлом и общим ptr для узла. Сделайте общий помощник. Направьте общий узел ptr на передний узел, T ptr на T ptr в прямом узле, а затем используйте псевдоним ctor общего ptr, чтобы получить общий ptr для узла.

Я не думаю, что это того стоит.

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