我目前正在试验多线程代码,其性能受两个数据成员是否共享同一缓存行的影响。
为了避免错误共享,我需要指定 struct
的布局而不受 Rust 编译器的干扰,因此我使用 repr(C)
。然而,这个相同的 struct
也实现了 Drop
,因此编译器警告 repr(C)
和 Drop
的“不兼容”,我不关心。
然而,试图压制这个徒劳的警告已经证明我超出了我的能力。
这是一个 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());
}
发出
#[warn(drop_with_repr_extern)]
。我试过指定
#[allow(drop_with_repr_extern)]
:struct
impl Drop
mod
并且都没有工作。只有 crate 级别的抑制有效,这是相当严厉的。
这导致我们:是否有更细粒度的方法来抑制此警告?
注意:欢迎使用更好的方法来确保两个数据成员分布在不同的缓存行上;然而,它们本身不会构成答案。
最佳答案
原因是 near the end of rustc_lint/builtin.rs :
lint 不会遍历 crate,而是使用 ctx.tcx.lang_items.drop_trait()
查找 crate 中的所有 Drop
trait 实现。注释仅在行走 crate 时被拾取。我在 this question 中偶然发现了同样的问题。因此,除非有人更改 lint 以实际遍历 crate 并在执行过程中拾取 Drop
impl
s,否则您需要对整个 crate 进行注释。
关于rust - 如何以细粒度抑制 "drop_with_repr_extern"的警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36104552/