2017-01-19 24 views
1

私はいくつかの小さなメソッドを持っていますが、一般的に実装する構造体が持つ他のメソッドの周りに1行のラッパーとして実装されています。形質メソッドがインライン化されていることを確認したい場合は、特性定義内に#[inline(always)]を入れるか、構造体ごとにimplを配置しますか?私は単にそれを形質の定義に入れたいと思っていますが、私はそれがうまくいかないと言うことができます。traitメソッド宣言と実装の両方で#[インライン]を使用できますか?

+2

これを特性のメソッド宣言に置き、それが機能しないのを見ました。私はあなたがどんな質問に答えたいか分からない。あなたはすでにそれを理解したようです。 – Shepmaster

答えて

1

inlineは何を意味しますか?

コンパイラがコールをインライン化すると、コールサイトで関数の本体がコピーされます。基本的には、コードがインライン化されている各コールサイトでコピー/貼り付けされているかのようです。

#[inline(always)]とは何ですか?

これは、常にインライン展開を実行するようにコンパイラに指示します。

通常は、コンパイラがインライン化を行う場合:

    関数の本体が知られている
  • ヒューリスティックのセット、これは良好なトレードオフは、(ただし、それはないかもしれない)であると推定しています特に形質法上の関数本体

なぜ私が指定することはできません#[inline(always)]のサイズに依存?

ボディーはありません。

これはまあまあ、私は知っているかもしれませんが、それにもかかわらず、これは本当です。 Rustの

、形質の2つの方法で使用することができる:形質オブジェクトとして使用する場合境界として

  • 、ランタイムインターフェースとして汎用パラメータ
  • ため、別名形質は、

オブジェクト文字通りボディはありません。呼び出される関数は実行時に決定されます。

コンパイラがダイナミックディスパッチを回避できるように、変数の実際のダイナミックタイプを決定または追跡しようとする特定の最適化(デバッグ)があります。コンパイラが各タイプの可能性を計算し、十分に可能性のあるもの(if A { A::call(x); } else if B { B::call(x); } else { x.call(); })のためにifラダーを作成するGCCで部分的な非仮想化を見たことがあります。しかし、それらはもちろん、成功することは保証されていません。

したがって、バーチャルコールでは#[inline(always)]のセマンティクスはどのようになりますか?コンパイラはただ静かに属性を無視すべきですか?


あなたが探していることは、新しい属性(require(inline(always))?)形質メソッドの実装上の特定の制約を強制するためにあるように私には思えます。

私が知る限り、これはまだ存在しません。

+0

[#[inline(always)] 'のみ[**コンパイラにインライン化を依頼する](https://doc.rust-lang.org/reference.html#inline-attributes)、コンパイラは無料ですそれを無視する。 – Shepmaster

+0

@Shepmaster:あなたが正しい間に、コンパイラが '#[inline(always)]リクエストを無視すると、私は非常に残念です。 '#[inline]'はヒントですが、それは問題ありませんが、 '#[inline(always)]'は順序です。そうでない場合は、インライン展開が有益かどうかをテストすることさえできません! –

関連する問題