【问题标题】:What trait tells the compiler that `T` is simple type with implicit copy?什么特征告诉编译器`T`是带有隐式复制的简单类型?
【发布时间】:2016-08-03 12:52:48
【问题描述】:

我打算将以下结构与 i32usize 等简单的数字类型一起使用,但在 contains() 方法的实现中,Rust 迫使我使用 Clone 而不是隐式副本(“不能搬出借来的内容”)。

我没有找到任何可以告诉编译器T 是带有隐式复制的简单类型的特征。我可以指望编译器会为数字类型丢弃 clone() 调用,而不会影响性能吗?

pub struct Rect<T> {
    pub x: T,
    pub y: T,
    pub w: T,
    pub h: T,
}

impl<T> Rect<T> where T: PartialOrd + Add<T, Output=T> + Clone {
    pub fn contains(&self, x: T, y: T) -> bool {
        x >= self.x && y >= self.y
            && x < self.x.clone() + self.w.clone()
            && y < self.y.clone() + self.h.clone()
    }
}

【问题讨论】:

    标签: generics rust


    【解决方案1】:

    您可以使用Copy trait 来指示一个类型具有复制语义(而不是移动语义)。

    impl<T> Rect<T> where T: PartialOrd + Add<T, Output=T> + Copy {
        pub fn contains(&self, x: T, y: T) -> bool {
            x >= self.x && y >= self.y
                && x < self.x + self.w
                && y < self.y + self.h
        }
    }
    

    我可以指望编译器会为数字类型丢弃 clone() 调用,而不会影响性能吗?

    我们希望编译器做这个优化,但不能保证(感谢@DK)。

    对于Copy 类型,有一个RFC 来形式化clone 的语义。 RFC 以以下内容开头:

    Rust 的一条潜规则通常是 Copy 类型的克隆等同于该类型的 memcpy

    【讨论】:

    • AFAIK,你所说的 clone 不是真的。有一个 RFC 要求如果它们都实现,则它们具有相同的效果,但没有任何内容表明编译器 必须 用位副本替换对 clone 的调用。理想情况下,优化器会处理这个问题,但同样,这不是保证
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2013-11-27
    • 2018-12-05
    相关资源
    最近更新 更多