Rust的trait对象是胖指针,其中包含2个常规指针:数据和vtable。 vtable是一个结构,其中包含析构函数指针,所有特征方法指针以及数据的大小和对齐方式。
尺寸和对齐字段是什么?
我找不到很多东西
Box
是否存储其分配的位置,大小和对齐方式?每个DST的每个大小变体无法获得自己的vtable版本,可以吗?)答案 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))
}
...
}
此功能又在多个地方使用:
librustc_codegen_llvm::operand::store_unsized()
用于在堆栈上分配足够的存储空间来存储未装箱的值。 librustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
用于实施size_of_val()
intrinsic librustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
用于实施min_align_of_val()
intrinsic 我没有发现当前将这些值输入到Rust释放函数(__rust_dealloc()
)中的任何地方,但是将来肯定会使用它们。