Description
It is a frequent source of confusion that MaybeUninit<T>
is not just preserving all the underlying bytes of storage, but actually if T
has padding then those bytes are lost on copies/moves of MaybeUninit<T>
.
This is currently pretty much a necessary consequence of the promise that MaybeUninit<T>
is ABI-compatible with T
: some ABIs don't preserve the padding of T
when it is passed to a function. However, this was not part of the intention with MaybeUninit
at all, it is something we discovered later.
Maybe we should try to take this back, and make the guarantee only for types without padding?
I am not even sure why we made this a guarantee. We made the type repr(transparent)
because for performance it is quite important that MaybeUninit<$int>
becomes just an iN
in LLVM. But that doesn't require a stable guarantee. And in fact it seems like it would almost always be a bug if the caller and callee disagree about whether the value has to be initialized. So I would be curious about real-world examples where this guarantee is needed.