1. ホーム
  2. c++

[解決済み] 静的インライン関数は絶対に使ってはいけないのか?

2023-07-01 05:28:07

質問

の使用には、2つの意味があります。 inline キーワードの使用には二つの意味があります(7.1.3/4節)。

  1. それは ヒント は、通常の関数呼び出しメカニズムよりも、 呼び出し時の関数本体の置換が望ましいことをコンパイラに示唆します。
  2. インライン置換が省略された場合でも、他のルール(特に 1 つの定義ルール を参照してください)に従います。

通常、主流のコンパイラは、必要であれば呼び出しの時点で関数本体を置き換えますので、関数をマークするには inline に対して単に #1 は実際には必要ありません。

さらにW.R.T. #2 として関数を宣言するとき、私は理解しています。 static inline という関数になります。

static キーワードを使用すると、強制的に inline 関数が内部リンク( インライン関数が外部リンクを持つ ) このような関数の各インスタンスは別の関数として扱われます ( それぞれの関数のアドレスは異なる )、これらの関数の各インスタンスは静的ローカル変数 & の独自のコピーを持っています。文字列リテラル( インライン関数はこれらのコピーを1つだけ持ちます。 )

したがって、このような関数は他の static 関数と同じように振る舞い、キーワード inline はもう重要ではなく、冗長になります。

ということで、実質的には関数 staticinline はどちらも全く使い道がありません。どちらか一方が static ( 最も好ましくない ) または inline ( 最も好ましい ),

ということは staticinline という関数で 実質的に を使うのは無駄ですか?

どのように解決するのですか?

あなたの分析は正しいのですが、必ずしも役に立たないことを意味するわけではありません。ほとんどのコンパイラが自動的に関数をインライン化するとしても (理由その1)、関数内で inline と宣言するのがベストです。

との相互作用を無視し inline , static 関数の使用は控えめにすべきです。また static 修飾子は、以前は非推奨であり、無名名前空間の使用が推奨されていました(C++03 §D.2)。思い出せないような曖昧な理由により、C++11 では非推奨から除外されましたが、ほとんど必要ないはずです。

ですから、実質的に関数を static と inline の両方でマークすることはまったく意味がありません。static (最も好ましくない) か inline (最も好ましい) のどちらかであるべきです。

優先順位という概念はありません。 static は、同じシグネチャを持つ異なる関数が、異なる .cpp ファイル(翻訳ユニット)に存在する可能性があることを意味します。 inline がなければ static は、異なる翻訳単位で同じ関数を同じ定義で定義しても良いという意味です。

の代わりに無名の名前空間を使用することが望ましいです。 static :

namespace {
    inline void better(); // give the function a unique name
}

static inline void worse(); // kludge the linker to allowing duplicates