Consider the type Thin<u64x2> where u64x2 has 128-bit (16-byte) alignment. The Thin type according to your scheme would be arranged as
struct Thin {
meta: &'static Vtable, // size = 8 bytes
padding: [u8; 8],
data: u64x2, // offset = 16
}
However, the alignment of Thin would only be 8,
struct Foo {
a: u8,
b: Thin<u64x2>, // offset = 8
}
here foo.b's offset can only be 8, which means the offset of foo.b.data would be 24, making access to foo.b.data misaligned.
We could fix it by making that “variable padding” depends on the run-time pointer value of self in additional to the alignment deriving from meta. The drawback is that ptr::copy will require two separate calls to memcpy.