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

时间:2018-08-24 20:22:54

标签: dynamic rust vtable

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

尺寸和对齐字段是什么?

我找不到很多东西

  • Blog post A:它用于释放内存,但今天不使用,可能会被某些将来使用的更灵活的机制使用(可能是什么?还存在吗?)
  • Blog post B:用于取消分配类型擦除的装箱值,因此他们知道如何释放内存(Box是否存储其分配的位置,大小和对齐方式?每个DST的每个大小变体无法获得自己的vtable版本,可以吗?)

1 个答案:

答案 0 :(得分: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))
    }
    ...
}

此功能又在多个地方使用:

我没有发现当前将这些值输入到Rust释放函数(__rust_dealloc())中的任何地方,但是将来肯定会使用它们。