Rust的trait对象是胖指针,包含两个常规指针:数据指针和vtable指针.vtable是一个包含析构函数指针、所有trait方法指针以及数据大小和对齐方式的 struct .

What are the size and alignment fields for?

我找不到太多:

  • Blog post A:它是用来释放内存的,但现在还没有使用,将来可能会被一些更灵活的机制使用(它可能是什么?现在还存在吗?)
  • Blog post B:它用于释放类型擦除的盒装值,这样它们就知道如何释放内存(Box不存储其分配的位置、大小和对齐方式吗?每个DST的每个大小变量都不能获得自己版本的vtable,是吗?)

推荐答案

以下是我迄今为止的发现:

尺寸和尺寸;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 deallocation函数(__rust_dealloc())中的任何地方,但它们肯定会在将来被用于该函数.

Rust相关问答推荐

如何优化小型固定大小数组中的搜索?

如何从polars DataFrame中获取一个列作为Option String?<>

有没有更好的方法从HashMap的条目初始化 struct ?

替换可变引用中的字符串会泄漏内存吗?

带参考文献的 rust 元组解构

无法定义名为&new&的关联函数,该函数的第一个参数不是self

字段类型为Boxed的 struct 的生存期必须超过static

在Rust中判断编译时是否无法访问

无符号整数的Rust带符号差

将一个泛型类型转换为另一个泛型类型

为什么`AlternateScreen`在读取输入键时需要按Enter键?

如何迭代属性以判断相等性?

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

一旦令牌作为文字使用,声明宏不匹配硬编码值?

将 `&T` 转换为新类型 `&N`

从现有系列和 map 值创建新系列

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

为移动和借位的所有组合实现 Add、Sub、Mul、Div