rust 如何检测类型何时需要调用“drop”?

798qvoo8  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(126)

Vec之类的类型运行truncate时,它们会对向量的每个成员调用ptr::drop_in_place
这对于int、float等基元类型来说并不是性能问题......因为drop调用已经过优化。
对于更复杂的容器类型(我为自己编写的容器类型),元素的迭代可能不是那么简单 (并且可能不会总是得到优化)
有没有一种方法可以检查一个类型是否有一个drop trait,以便在这种情况下可以避免访问所有成员?

u3r8eeie

u3r8eeie1#

使用std::mem::needs_drop
根据描述,这个函数是安全的,因此不调用析构函数应该是合理的。

1.21.0之前版本

可以使用std::intrinsics::needs_drop,但需要激活一个(永久不稳定)特性。
它仍然可以使用,但仍然不稳定。

vyu0f0g1

vyu0f0g12#

你不能在泛型边界中推理Drop。没有显式Drop impl的类型不满足Drop边界:

fn foo<T: Drop>(t: T) {}

foo(5);
foo("5".to_owned());

只有具有显式Drop impl的类型才满足此界限:

foo(vec![42]); // works

Drop由编译器在后台静默处理(否则您必须在任何地方指定它)。这意味着,即使是专门化或OIBIT也不能用作解决方案。
也就是说,您可以通过将type的值转换为trait对象并检查vtable的drop条目是否为NULL来检测是否存在任何(甚至是生成的)drop impl(但不应该)。

相关问题