Box<T>
в основном *const T
(На самом деле это новый тип около Unique<T>
, который сам по себе является NonNull<T>
с PhantomData<T>
(для dropck ), но давайте придерживаться *const T
для простоты).
Указатель в Rust обычно имеет тот же размер, что и size_of::<usize>()
, за исключением случаев, когда T
представляет собой тип динамического размера (DST).В настоящее время размер Box<DST>
равен 2 * size_of::<usize>()
(точное представление не стабильно на момент написания статьи).Указатель на DST называется FatPtr
.
. В настоящее время существует два вида DST: срезы и черты.FatPtr
для среза определяется следующим образом:
#[repr(C)]
struct FatPtr<T> {
data: *const T,
len: usize,
}
Примечание: Для указателя признака len
заменяется указателем на vtable
.
Получив эту информацию, на ваш вопрос можно ответить:
Box<i8>
: i8
- это тип размера => в основном такой же, как *const i8
=> 8 байт (с шириной указателя 64 бита) Box<[i8]>
: [i8]
- это DST => в основном то же самое, что FatPtr<i8>
=> размер 16 байтов (с шириной указателя 64 бита) Box<&[i8]>
: &[i8]
- , а не DST.Это в основном то же самое, что *const FatPtr<i8>
=> 8 байт (с шириной указателя 64 бита)