2016-08-03 9 views
0

Ich beabsichtige, die folgende Struktur mit einfachen numerischen Typen wie i32, usize zu verwenden, aber in der Implementierung der Methode zwingt Rust mich, Clone anstelle einer impliziten Kopie zu verwenden ("kann nicht ausgeliehenen Inhalt").Welche Eigenschaft teilt dem Compiler mit, dass `T` ein einfacher Typ mit impliziter Kopie ist?

Ich habe keine Eigenschaft gefunden, die dem Compiler sagen würde, dass T einfacher Typ mit impliziter Kopie ist. Kann ich auf den Compiler zählen, dass der Aufruf clone() für numerische Typen ohne Leistungseinbußen verworfen wird?

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() 
    } 
} 

Antwort

2

können Sie das Copy Merkmal verwenden, um anzuzeigen, dass eine Art Kopie Semantik (statt bewegen Semantik) hat.

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 
    } 
} 

Kann ich auf dem Compiler zählen, dass die clone() Aufruf für numerische Typen verworfen werden, ohne Leistungseinbußen?

Wir hoffen, dass der Compiler diese Optimierung durchführt, aber es gibt keine Garantien (danke @DK).

Es gibt eine RFC, um die Semantik von clone für Copy Typen zu formalisieren. Die RFC beginnen mit den folgenden:

Es ist im Allgemeinen eine unausgesprochene Regel von Rust gewesen, dass ein Klon eines Copy Typs zu einem memcpy dieses Typs

+1

AFAIK entspricht, was Sie gesagt haben über 'clone' ist nicht wahr. Es gab einen RFC, der erforderte, dass sie den gleichen Effekt haben, wenn sie beide implementiert sind, aber es gibt nichts, was besagt, dass der Compiler * den Aufruf von "clone" durch eine Bitkopie ersetzen muss. Im Idealfall wird sich der Optimierer darum kümmern, aber auch das ist nicht * garantiert *. –