2016-03-19 8 views
4

現在、マルチスレッドコードを試しています。そのパフォーマンスは、2つのデータメンバーが同じキャッシュラインを共有しているかどうかによって異なります。「drop_with_repr_extern」の警告を細かく抑制する方法を教えてください。

偽の共有を避けるために、私はを使用して、Rustコンパイラを使わずにstructのレイアウトを指定する必要があります。しかし、これと同じstructDropを実装しているため、コンパイラはrepr(C)Dropの「非互換性」について警告します。

しかし、この無駄な警告を黙らせようとすると、私のことを証明できませんでした。ここで

reduced exampleです:#[warn(drop_with_repr_extern)]を発する

#[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()); 
} 

私は#[allow(drop_with_repr_extern)]を指定して試してみました:

  • struct
  • impl Drop
  • mod

でとどちらも働きました。クレートレベルの抑圧だけが機能しましたが、これはかなり重いです。

これは、この警告を抑制する、より詳細な方法ですか?

注:2つのデータメンバーが異なるキャッシュラインに分散されていることを確認するには、歓迎します。しかし、彼らは自分自身で答えを構成することはありません。

+0

私はこれが糸くずの製造方法によるものであることを鋭敏にしています。私のPCにアクセスすると、コードが表示されます。 – llogiq

答えて

2

理由はnear the end of rustc_lint/builtin.rs次のとおりです。

lintが代わりにクレート内のすべてのDrop形質実装をルックアップするためにctx.tcx.lang_items.drop_trait()を使用して、クレートを歩いていません。注釈は、木枠を歩いている間にのみピックアップされます。私はthis questionで同じ問題を偶然見つけました。だから、誰かが実際に木枠を歩くために糸くずを入れ替えて、Dropimplを手に取らない限り、箱全体に注釈を付ける必要があります。

+0

ありがとう!このように実装されているのは面倒ですが、少なくとも私は今のところ最良の方法はないことを知っています。 –

関連する問題