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