如何细粒度地抑制 "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)]
:
- 在
struct
- 在
impl Drop
- 在
mod
都没有用。只有板条箱级别的抑制有效,这是相当严厉的。
这让我们想到:是否有更精细的方法来抑制此警告?
注意:欢迎评论确保两个数据成员分布在不同缓存行的更好方法;然而,它们本身并不构成答案。
原因是near the end of rustc_lint/builtin.rs:
lint 不会遍历 crate,而是使用 ctx.tcx.lang_items.drop_trait()
查找 crate 中的所有 Drop
trait 实现。注释只有在走板条箱时才会被拾取。我在 中偶然发现了同样的问题。因此,除非有人更改 lint 以实际行走板条箱并拾取 Drop
impl
s,否则您需要对整个板条箱进行注释。
我目前正在试验多线程代码,其性能受两个数据成员是否共享同一缓存行的影响。
为了避免错误共享,我需要指定 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)]
:
- 在
struct
- 在
impl Drop
- 在
mod
都没有用。只有板条箱级别的抑制有效,这是相当严厉的。
这让我们想到:是否有更精细的方法来抑制此警告?
注意:欢迎评论确保两个数据成员分布在不同缓存行的更好方法;然而,它们本身并不构成答案。
原因是near the end of rustc_lint/builtin.rs:
lint 不会遍历 crate,而是使用 ctx.tcx.lang_items.drop_trait()
查找 crate 中的所有 Drop
trait 实现。注释只有在走板条箱时才会被拾取。我在 Drop
impl
s,否则您需要对整个板条箱进行注释。