Должны ли мы использовать Option или ptr :: null для представления нулевого указателя в Rust? - PullRequest
0 голосов
/ 15 января 2019

Список ссылок стандартной библиотеки Node использует тип Option :

struct Node<T> {
    next: Option<NonNull<Node<T>>>,
    prev: Option<NonNull<Node<T>>>,
    element: T,
}

и создает узел с таким кодом:

Node {
    next: None,
    prev: None,
    element,
}

Реализация LeafNode из BTree, стандартная библиотека использует необработанный указатель для родительского узла :

struct LeafNode<K, V> {
    parent: *const InternalNode<K, V>,
    parent_idx: MaybeUninit<u16>,
    len: u16,
    keys: MaybeUninit<[K; CAPACITY]>,
    vals: MaybeUninit<[V; CAPACITY]>,
}

и создает новые конечные узлы , устанавливая parent в ptr::null:

LeafNode {
    keys: MaybeUninit::uninitialized(),
    vals: MaybeUninit::uninitialized(),
    parent: ptr::null(),
    parent_idx: MaybeUninit::uninitialized(),
    len: 0
}

Мы можем использовать nullptr для реализации приведенного выше кода на C ++, в чем же разница между Option и std::ptr::null() для представления нулевого указателя? Каков рекомендуемый способ представления нулевого указателя?

1 Ответ

0 голосов
/ 15 января 2019

В общем, я бы рекомендовал использовать NonNull<T> над *const T или *mut T, используя Option в зависимости от ситуации, чтобы определить, когда указатель может быть нулевым.

Причина двоякая:

  1. Является ли значение NULL действительным или нет, задокументировано и применяется при использовании NonNull.
  2. *const T и *mut T по существу взаимозаменяемы и действительно могут быть связаны друг с другом, так что const или mut могут дать ложное чувство безопасности.

Реализация BTree, возможно, просто не была перенесена на NonNull, что относительно недавно - она ​​стабилизировалась только в 1.25.

...