Demilade Sonuga's blog
All postsBox I
Now that we're done with the heap allocator, the next thing on our list is the Box.
Box is a smart pointer that is used to hold data of any type on the heap. For a refresher on the Box struct
check the references. It's possible to use the alloc::boxed::Box struct in no std programs but we won't be
using it because of our promise at the beginning to build the project using only the core library.
Because of this self-imposed limitation, our Box will be a bit limited, but it will be good enough for our
purposes. The thing about Box is that it is a special struct with special support from the compiler, and
our custom Box is not going to have this special support.
Aims
Firstly, our Box must be able to hold data of any type, just like the original Box. A Box that can hold
an i32 should be the same Box that can hold a closure or a regular struct.
Next: Our Box must be able to allocate properly aligned memory for the data it holds and deallocate that memory
when the Box is no longer needed.
Remember that the reason we want a Box in the first place is so we can use it to store closures for
event handlers. And the reason we need a Box for this is that we cannot predict the size a closure will have.
That is solely determined by the compiler.
Another thing we'll need along the way: our Box must have a mechanism for retrieving the underlying pointer
and creating a new Box from a pointer to data and the allocator of the memory that data is stored in.
That covers the requirements for our Box.
You should come up with an implementation yourself. Refer to the implementations in std and alloc
but because of our much simpler and specific purposes, ours will not be nearly as complex as those ones.
In The Next Post
We'll start implementing a Box
References
- Box explanation: https://doc.rust-lang.org/book/ch15-01-box.html
- Box implementation in
alloc: https://doc.rust-lang.org/alloc/boxed/struct.Box.html - Box implementation in
std: https://doc.rust-lang.org/std/boxed/struct.Box.html