为什么特征对象 vtables 包含大小和对齐方式?

Why do trait object vtables contain size and alignment?

Rust 的特征对象是包含 2 个常规指针的胖指针:指向数据和指向 vtable。 vtable 是一个包含析构函数指针、所有特征方法指针以及最后的数据大小和对齐方式的结构。

大小和对齐字段有什么用?

我找不到太多:

这是我目前的发现:

vtable 中的大小和对齐属性在 librustc_codegen_llvm::glue::size_and_align_of_dst() 函数中加载,其中 returns 动态大小类型的大小和对齐。对于 ty::Dynamic(..) 值(编译器描述特征对象的内部方式),大小和对齐从 vtable 中读取:

match t.sty {
    ty::Dynamic(..) => {
        // load size/align from vtable
        let vtable = info.unwrap();
        (meth::SIZE.get_usize(bx, vtable), meth::ALIGN.get_usize(bx, vtable))
    }
    ...
}

这个函数又用在几个地方:

我没有发现这些值目前被送入 Rust 释放函数的任何地方 (__rust_dealloc()),但它们肯定可以在未来用于此目的。