Box<T>
Box
Ă© um ponteiro owned para dados no heap:
Box<T>
implementa Deref<Target = T>
, o que significa que vocĂȘ pode chamar mĂ©todos de T
diretamente em um Box<T>
.
Tipos de dados recursivos ou tipos de dados com tamanhos dinĂąmicos precisam usar uma Box
:
Speaker Notes
This slide should take about 8 minutes.
-
Box
Ă© parecido comstd::unique_ptr
em C++, exceto que ele Ă© garantidamente nĂŁo nulo. -
Uma
Box
Ă© Ăștil quando vocĂȘ:- hĂĄ um tipo cujo tamanho nĂŁo estĂĄ disponĂvel em tempo de compilação, mas o compilador Rust precisa saber o tamanho exato.
- quer transferir o ownership de um grande volume de dados. Ao invés de copiar grandes volumes de dados na pilha, eles são armazenados usando uma
Box
no heap e apenas o ponteiro Ă© movido.
-
Se
Box
nĂŁo for usado e tentarmos incorporar umList
diretamente noList
, o compilador nĂŁo conseguiria calcular um tamanho fixo da struct na memĂłria (List
teria tamanho infinito). -
Box
resolve esse problema, pois tem o mesmo tamanho de um ponteiro normal e apenas aponta para o prĂłximo elemento daList
no heap. -
Remova o
Box
na definição deList
e mostre o erro de compilação. NĂłs obtemos a mensagem ârecursive without indirectionâ (recursivo sem indireção), porque para recursĂŁo de dados, temos que usar indireção, umBox
ou referĂȘncia de algum tipo, ao invĂ©s de armazenar o valor diretamente.
Mais para Explorar
Otimização de Nicho
Embora Box
pareça com std::unique_ptr
em C++, ele nĂŁo pode ser vazio/nulo. Isso faz com que Box
seja um dos tipos que permitem ao compilador otimizar o armazenamento de alguns enums.
Por exemplo, Option<Box<T>>
tem o mesmo tamanho que apenas Box<T>
, porque o compilador usa o valor NULL para discriminar as variantes em vez de usar uma tag explĂcita (âNull Pointer Optimizationâ):