Function std::mem::needs_drop

1.21.0 (const: 1.36.0) · source ·
pub const fn needs_drop<T>() -> boolwhere
    T: ?Sized,
Expand description

如果丢弃类型为 T 的值很重要,则返回 true

这纯粹是一个优化提示,可以保守地实现: 对于实际上不需要丢弃的类型,它可能返回 true。 因此,始终返回 true 将是此函数的有效实现。但是,如果此函数实际返回 false,则可以确定丢弃 T 没有副作用。

需要手动丢弃其数据的诸如集合之类的底层实现,应使用此函数来避免在销毁它们时不必要地丢弃其所有内容。

这可能不会对发行版本产生影响 (可以轻松检测并消除没有副作用的循环),但是对于调试版本而言,这通常是一个大胜利。

请注意,drop_in_place 已经执行了此检查,因此,如果您的工作量可以减少到少量的 drop_in_place 调用,则无需使用此功能。 特别要注意的是,您可以 drop_in_place 一个切片,这将对所有值进行一次 needs_drop 检查。

因此,像 Vec 这样的类型只是 drop_in_place(&mut self[..]),而没有显式使用 needs_drop。 另一方面,像 HashMap 这样的类型必须一次丢弃一个值,并且应使用此 API。

Examples

这是一个集合如何利用 needs_drop 的示例:

use std::{mem, ptr};

pub struct MyCollection<T> {
    /* ... */
}

impl<T> Drop for MyCollection<T> {
    fn drop(&mut self) {
        unsafe {
            // 丢弃数据
            if mem::needs_drop::<T>() {
                for x in self.iter_mut() {
                    ptr::drop_in_place(x);
                }
            }
            self.free_buffer();
        }
    }
}
Run