2016-03-19 34 views
4

Ich experimentiere gerade mit Multi-Threading-Code, und seine Leistung wird davon beeinflusst, ob zwei Datenmitglieder die gleiche Cache-Zeile teilen oder nicht.Wie unterdrückt man die Warnung für "drop_with_repr_extern" mit feiner Granularität?

Um falsches Teilen zu vermeiden, muss ich das Layout des struct ohne den Rust-Compiler einmischen, und so verwende ich repr(C). Dieselbe struct implementiert jedoch auch Drop, und daher warnt der Compiler vor der "Inkompatibilität" von repr(C) und Drop, die mich nichts ausmachen.

Der Versuch, diese vergebliche Warnung zum Schweigen zu bringen, hat sich jedoch als unbegründet erwiesen. Hier

ist ein reduced example:

#[repr(C)] 
#[derive(Default, Debug)] 
struct Simple<T> { 
    item: T, 
} 

impl<T> Drop for Simple<T> { 
    fn drop(&mut self) {} 
} 

fn main() { 
    println!("{:?}", Simple::<u32>::default()); 
} 

die #[warn(drop_with_repr_extern)] emittiert.

Ich habe versucht, #[allow(drop_with_repr_extern)] Angabe:

  • bei struct
  • bei impl Drop
  • bei mod

und weder gearbeitet. Lediglich die Kistenebene Unterdrückung funktioniert, die eher schwerfällig ist.

Was führt uns dazu: Gibt es eine genauere Möglichkeit, diese Warnung zu unterdrücken?

Hinweis: Bemerkungen zu einem besseren Weg, um sicherzustellen, dass zwei Datenelemente über verschiedene Cache-Zeilen verteilt sind, sind willkommen; Sie werden jedoch keine eigenen Antworten darstellen.

+0

Ich habe eine Ahnung, dass dies aufgrund der Art ist, wie die Flusen gebaut werden. Werde den Code anschauen, wenn ich an meinen PC komme. – llogiq

Antwort

2

Der Grund ist near the end of rustc_lint/builtin.rs:

Die Flusen nicht die Kiste nicht gehen, anstatt ctx.tcx.lang_items.drop_trait() mit nachschlagen alle Drop Charakterzug Implementierungen innerhalb der Kiste. Die Anmerkungen werden nur beim Gehen der Kiste aufgenommen. Ich bin über das gleiche Problem in this question gestolpert. Also, wenn jemand den Fussel nicht ändert, um tatsächlich die Kiste zu gehen und Dropimpl s zu nehmen, wie es geht, müssen Sie die ganze Kiste annotieren.

+0

Danke! Es ist ärgerlich, dass es auf diese Weise umgesetzt wird, aber zumindest weiß ich, dass es für jetzt keinen Weg gibt. –