Производительность дерева C 17 с использованием необязательного<unique_ptr>?

#c #c 17

#c #c 17

Вопрос:

Мне очень нравится стиль кода, который используется при использовании чего-то подобного

 class Node {
public:
  std::optional<std::unique_ptr<Node>> left;
  std::optional<std::unique_ptr<Node>> right;
  Key key;
  Val val;
};
  

Как производительность будет сравниваться с деревом в стиле C с использованием проверок malloc / delete и nullptr ? Будет ли какое-либо снижение производительности?

Комментарии:

1. Почему необязательный для unique_ptr ? unique_ptr выполняет задание, поскольку оно может быть обнуляемым через nullptr

2. В чем будет разница между необязательным значением null и необязательным значением null указателя? Есть ли существенная разница между «нет поддерева» и «пустое поддерево»?

Ответ №1:

Использование std::optional<std::unique_ptr<Node>> приведет к некоторой потере пространства и, возможно, дополнительной логической проверке во время выполнения.

Но unique_ptr имеет «не принадлежащее» состояние, и в этом случае оно «содержит» a nullptr , которого должно быть достаточно, чтобы выразить состояние без значения.

 class Node {
public:
  std::unique_ptr<Node> left;
  std::unique_ptr<Node> right;
  Key key;
  Val val;
};
  

Есть даже возможность operator bool() проверить, есть ли связанное значение или нет.

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