如何细粒度地抑制 "drop_with_repr_extern" 的警告?

How to suppress the warning for "drop_with_repr_extern" at a fine granularity?

我目前正在试验多线程代码,其性能受两个数据成员是否共享同一缓存行的影响。

为了避免错误共享,我需要指定 struct 的布局,而不会受到 Rust 编译器的干扰,因此我使用 repr(C)。然而,同样的 struct 也实现了 Drop,因此编译器警告 repr(C)Drop 的 "incompatibility",我不关心这些。

然而,事实证明我无法消除这种无用的警告。

这是一个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)]:

都没有用。只有板条箱级别的抑制有效,这是相当严厉的。

这让我们想到:是否有更精细的方法来抑制此警告?

注意:欢迎评论确保两个数据成员分布在不同缓存行的更好方法;然而,它们本身并不构成答案。

原因是near the end of rustc_lint/builtin.rs:

lint 不会遍历 crate,而是使用 ctx.tcx.lang_items.drop_trait() 查找 crate 中的所有 Drop trait 实现。注释只有在走板条箱时才会被拾取。我在 中偶然发现了同样的问题。因此,除非有人更改 lint 以实际行走板条箱并拾取 Drop impls,否则您需要对整个板条箱进行注释。