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

为了避免错误共享,我需要指定 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)] :
  • at struct
  • at impl Drop
  • at 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/

    10-12 04:41