[解決済み] 静的インライン関数は絶対に使ってはいけないのか?
質問
の使用には、2つの意味があります。
inline
キーワードの使用には二つの意味があります(7.1.3/4節)。
- それは ヒント は、通常の関数呼び出しメカニズムよりも、 呼び出し時の関数本体の置換が望ましいことをコンパイラに示唆します。
- インライン置換が省略された場合でも、他のルール(特に 1 つの定義ルール を参照してください)に従います。
通常、主流のコンパイラは、必要であれば呼び出しの時点で関数本体を置き換えますので、関数をマークするには
inline
に対して単に
#1
は実際には必要ありません。
さらにW.R.T.
#2
として関数を宣言するとき、私は理解しています。
static inline
という関数になります。
は
static
キーワードを使用すると、強制的に
inline
関数が内部リンク(
インライン関数が外部リンクを持つ
) このような関数の各インスタンスは別の関数として扱われます (
それぞれの関数のアドレスは異なる
)、これらの関数の各インスタンスは静的ローカル変数 & の独自のコピーを持っています。文字列リテラル(
インライン関数はこれらのコピーを1つだけ持ちます。
)
したがって、このような関数は他の
static
関数と同じように振る舞い、キーワード
inline
はもう重要ではなく、冗長になります。
ということで、実質的には関数
static
と
inline
はどちらも全く使い道がありません。どちらか一方が
static
(
最も好ましくない
) または
inline
(
最も好ましい
),
ということは
static
と
inline
という関数で
実質的に
を使うのは無駄ですか?
どのように解決するのですか?
あなたの分析は正しいのですが、必ずしも役に立たないことを意味するわけではありません。ほとんどのコンパイラが自動的に関数をインライン化するとしても (理由その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
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] Pythonの関数内の静的変数に相当するものは何ですか?
-
[解決済み] 関数/メソッドのキーワード 'inline' はいつ書けばよいのですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】C#のインライン関数?
-
[解決済み】C++におけるstaticキーワードとその様々な使用法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。