Оптимизация нулевого указателя удаляет отдельное поле тега.

чение Rust с использованием слишком большого количества связанных списковАвтор упоминает:Однако, если у нас есть особый вид перечисления:

начинается оптимизация нулевого указателя, которая

enum Foo {
    A,
    B(ContainsANonNullPtr),
}

устраняет пространство, необходимое для тега, Если вариант, все перечисление установлено на всеA«S. В противном случае вариант0, Это работает, потому чтоB никогда не может быть всемBс, так как он содержит ненулевой указатель.0Я думаю, что автор говорит, что (при условии

 4 бита, иA это 4 бита)Bрасположение памяти

let test = Foo::A

но

0000 0000

расположение памяти

let test = Foo::B

Что именно здесь оптимизировано? Не всегда оба представления представляют 8 битов. Что это означает, когда автор заявляет

some 8 bit non 0 value

Это значит

и некоторые другие важные типы в Rust не имеют накладных расходов при&, &mut, Box, Rc, Arc, VecЯ не понимаю, учебник неточный? или это устаревшее?Option

 Jal04 окт. 2017 г., 07:39
@KrassiEm что ты пытаешься сказать?
 Shepmaster04 окт. 2017 г., 14:52
Оптимизация нулевого указателя в основном означает, что если у вас есть перечисление с двумя вариантами, где один вариант не имеет связанных данных, а другой вариант имеет ассоциированные данные, где битовая комбинация всех нулей не является допустимым значением, тогда само перечисление будет возьмите ровно столько же места, сколько это связанное значение, используя битовый шаблон со всеми нулями, чтобы указать, что это другой вариант.

Ответы на вопрос(2)

Решение Вопроса

 точно такой же размер, какOption<&T> вместо того, чтобы требовать дополнительного слова.&T помеченный союз. Без оптимизации это выглядит так

enumОптимизация нулевого указателя удаляет отдельное поле тега.

Что такое оптимизация нулевого указателя в

Foo::A;    // tag+data 0x00
Foo::B(2); // tag+data 0x02

Ваш ответ на вопрос