#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()
проверить, есть ли связанное значение или нет.
Приведенный выше код должен компилироваться без потери производительности по сравнению с решением с необработанными указателями.