当Vec之类的类型运行truncate时,它们会对向量的每个成员调用ptr::drop_in_place。这对于int、float等基元类型来说并不是性能问题......因为drop调用已经过优化。对于更复杂的容器类型(我为自己编写的容器类型),元素的迭代可能不是那么简单 (并且可能不会总是得到优化)。有没有一种方法可以检查一个类型是否有一个drop trait,以便在这种情况下可以避免访问所有成员?
Vec
truncate
ptr::drop_in_place
u3r8eeie1#
使用std::mem::needs_drop。根据描述,这个函数是安全的,因此不调用析构函数应该是合理的。
std::mem::needs_drop
可以使用std::intrinsics::needs_drop,但需要激活一个(永久不稳定)特性。它仍然可以使用,但仍然不稳定。
std::intrinsics::needs_drop
vyu0f0g12#
你不能在泛型边界中推理Drop。没有显式Drop impl的类型不满足Drop边界:
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(但不应该)。
NULL
2条答案
按热度按时间u3r8eeie1#
使用
std::mem::needs_drop
。根据描述,这个函数是安全的,因此不调用析构函数应该是合理的。
1.21.0之前版本
可以使用
std::intrinsics::needs_drop
,但需要激活一个(永久不稳定)特性。它仍然可以使用,但仍然不稳定。
vyu0f0g12#
你不能在泛型边界中推理
Drop
。没有显式Drop
impl的类型不满足Drop
边界:只有具有显式
Drop
impl的类型才满足此界限:Drop
由编译器在后台静默处理(否则您必须在任何地方指定它)。这意味着,即使是专门化或OIBIT也不能用作解决方案。也就是说,您可以通过将type的值转换为trait对象并检查vtable的drop条目是否为
NULL
来检测是否存在任何(甚至是生成的)drop impl(但不应该)。