为什么特征对象 vtables 包含大小和对齐方式?
Why do trait object vtables contain size and alignment?
Rust 的特征对象是包含 2 个常规指针的胖指针:指向数据和指向 vtable。 vtable 是一个包含析构函数指针、所有特征方法指针以及最后的数据大小和对齐方式的结构。
大小和对齐字段有什么用?
我找不到太多:
- Blog post A: 它用于释放内存,但今天没有使用,可能会被未来的一些更灵活的机制使用(它可能是什么?现在还存在吗?)
- Blog post B:它用于释放类型擦除的装箱值,因此他们知道如何释放内存(
Box
不存储其分配的位置、大小和对齐方式吗?每个大小的变体每个 DST 都无法获得自己的 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))
}
...
}
这个函数又用在几个地方:
librustc_codegen_llvm::operand::store_unsized()
用于在堆栈上分配足够的存储空间 space 用于存储未装箱的值。
librustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
for implementing the size_of_val()
intrinsic
librustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
for implementing the min_align_of_val()
intrinsic
我没有发现这些值目前被送入 Rust 释放函数的任何地方 (__rust_dealloc()
),但它们肯定可以在未来用于此目的。
Rust 的特征对象是包含 2 个常规指针的胖指针:指向数据和指向 vtable。 vtable 是一个包含析构函数指针、所有特征方法指针以及最后的数据大小和对齐方式的结构。
大小和对齐字段有什么用?
我找不到太多:
- Blog post A: 它用于释放内存,但今天没有使用,可能会被未来的一些更灵活的机制使用(它可能是什么?现在还存在吗?)
- Blog post B:它用于释放类型擦除的装箱值,因此他们知道如何释放内存(
Box
不存储其分配的位置、大小和对齐方式吗?每个大小的变体每个 DST 都无法获得自己的 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))
}
...
}
这个函数又用在几个地方:
librustc_codegen_llvm::operand::store_unsized()
用于在堆栈上分配足够的存储空间 space 用于存储未装箱的值。librustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
for implementing thesize_of_val()
intrinsiclibrustc_codegen_llvm::intrinsic::codegen_intrinsic_call()
for implementing themin_align_of_val()
intrinsic
我没有发现这些值目前被送入 Rust 释放函数的任何地方 (__rust_dealloc()
),但它们肯定可以在未来用于此目的。