私はいくつかの小さなメソッドを持っていますが、一般的に実装する構造体が持つ他のメソッドの周りに1行のラッパーとして実装されています。形質メソッドがインライン化されていることを確認したい場合は、特性定義内に#[inline(always)]
を入れるか、構造体ごとにimpl
を配置しますか?私は単にそれを形質の定義に入れたいと思っていますが、私はそれがうまくいかないと言うことができます。traitメソッド宣言と実装の両方で#[インライン]を使用できますか?
答えて
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))
?)形質メソッドの実装上の特定の制約を強制するためにあるように私には思えます。
私が知る限り、これはまだ存在しません。
[#[inline(always)] 'のみ[**コンパイラにインライン化を依頼する](https://doc.rust-lang.org/reference.html#inline-attributes)、コンパイラは無料ですそれを無視する。 – Shepmaster
@Shepmaster:あなたが正しい間に、コンパイラが '#[inline(always)]リクエストを無視すると、私は非常に残念です。 '#[inline]'はヒントですが、それは問題ありませんが、 '#[inline(always)]'は順序です。そうでない場合は、インライン展開が有益かどうかをテストすることさえできません! –
- 1. JavaのInterfaceで宣言されたメソッドにクラスを実装するリファレンスを使うことができます
- 2. C++のクライアント側でDLLで宣言されたメソッドを実装する方法
- 3. C++オブジェクトを宣言するときに仮想メソッドを実装できますか?
- 4. Javaインターフェイスのパラメータサブタイプを宣言し、Java実装メソッドのサブタイプを使用する
- 5. DLL内で前方宣言を使用できますか?
- 6. Objective-C - メソッド宣言でポインタの配列を実装する方法
- 7. 関数の宣言と実装の両方に初期化リストを書く必要がありますか?
- 8. インライン定義と宣言
- 9. クラス実装のプライベートプロパティ宣言?
- 10. ヘッダーファイル内のクラス宣言と実装
- 11. Predicate Delegateをインラインでどのように宣言しますか?
- 12. クラスをインラインでどのように宣言しますか?
- 13. 実行時のメソッド宣言
- 14. JavaとJavascriptの両方で使用できるテンプレート言語は何ですか?
- 15. Obj-cで宣言されるメソッドのルールは何ですか?宣言のないメソッドを直接使用できますか?
- 16. WCFでカスタムIAuthorizationPolicyを宣言的に実装する方法は?
- 17. モジュールをTypescriptでグローバルに使用できると宣言できますか?
- 18. 素材:宣言は「最終」と「動的」の両方にはできません
- 19. std :: enable_ifを使用するときに、宣言と実装を分割する方法
- 20. カスタムタイプをポート宣言で使用できますか?
- 21. Java(JIT)インライン再帰メソッドを使用できますか?
- 22. PHP - 静的メソッドと非静的メソッドを宣言できますか?
- 23. Ruby - プライベートメソッドのインライン宣言
- 24. メソッド宣言でかっこを使用する場合
- 25. 定数内のMeteor onLogoutメソッドを宣言できますか?
- 26. CSSでvwとvhの両方を使用できますか?
- 27. アプリでGCMとFCMの両方を使用できますか?
- 28. メソッドを実装せずにカテゴリ内のメソッドを宣言するのはなぜですか?
- 29. c# "?"メソッド宣言で
- 30. 前方宣言とプロトタイプ宣言 "宣言"を呼び出すだけですか?
これを特性のメソッド宣言に置き、それが機能しないのを見ました。私はあなたがどんな質問に答えたいか分からない。あなたはすでにそれを理解したようです。 – Shepmaster