#[inline] を使うべき場合
インライン化は、実行速度の向上の可能性、コンパイル時間、コードサイズの間のトレードオフです。これについては、hashbrown クレートへのこの PR でいくつか議論されています。そのスレッドから引用します。
#[inline]は、単なるインライン化のヒントとは大きく異なります。前述したように、#[inline]が行うことに相当するものは C++ にはありません。デバッグモードでは、rustc は基本的に#[inline]を無視し、まるで書かれていないかのように扱います。リリースモードでは、コンパイラーはデフォルトで、#[inline]関数を参照しているすべてのコード生成ユニットに対してその関数をコード生成し、さらにinlinehintも追加します。つまり、16 個の CGU があり、そのすべてがあるアイテムを参照している場合、そのすべてにアイテムの実装全体がインライン化されるということです。
#[inline] を追加できる場合:
- public で、小さく、ジェネリックではない関数。
#[inline] は必要ないはずの場合:
- スコープ内に何らかのジェネリクスがあるメソッド。
- デフォルト実装を持たないトレイト上のメソッド。
#[inline] はいつでも後から導入できるため、迷った場合は単に削除してかまいません。
#[inline(always)] については?
#[inline(always)] が必要になることはほとんどありません。限られた場所で使用される private なヘルパーメソッドや、自明な演算子では有益な場合があります。この属性はマイクロベンチマークによって正当化されるべきです。
レビュー担当者向け
#[inline] はいつでも後から追加できるため、それが適切かどうかについて少しでも議論がある場合は、まずアノテーションを削除して判断を先送りしてかまいません。