为什么trait对象vtable包含大小和对齐?

Cod*_*ich 6 dynamic vtable rust

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

大小和对齐字段是什么?

我找不到多少:

  • 博客文章 - 答:它是用于释放内存,但今天没有使用,可能会被一些未来,更灵活的机制使用(它可能是什么?有任何存在吗?)
  • 博客文章B:它用于解除分配类型擦除的盒装值,因此他们知道如何释放内存(不Box存储位置,大小和分配的对齐方式?每个DST的每个大小变体都无法获得自己的vtable版本, 它可以?)

Wes*_*ser 8

这是我到目前为止所发现的:

vtable中的大小和对齐属性将加载到函数中,该librustc_codegen_llvm::glue::size_and_align_of_dst()函数返回动态大小类型的大小和对齐方式.对于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))
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个功能反过来用在几个地方:

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

  • @CodeSandwich Rustonomicon可能不清楚.某些DST类似于切片 - 具有几个大小的字段的结构,然后是切片(或其他DST)作为最终字段.指向任何DST的指针必须以额外的"usize"形式携带额外的信息.对于切片或类似切片的DST,额外信息是切片的大小.对于trait对象,它是指向vtable的指针. (2认同)