問題タブ [inline-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - extern "C" インライン関数
このコードは未定義の動作を引き起こしますか?
header.h
def.c
use.c
main.cpp
inline
これは、 C と C++ の両方で関数を使用する必要があるプログラムの例です。def.c
が削除foo
され、C で使用されていない場合は機能しますか? (これは、C コンパイラが C99 であることを前提としています。)
このコードは、次のようにコンパイルすると機能します。
foo
コンパイラが異なるオブジェクトファイルで出力する異なるバージョンがマージされるため、一度だけextern_C_inline
ですが、この動作が標準で指定されているかどうかを知りたいです。extern
の定義を削除foo
して作成するとstatic
、コンパイラが各コンパイル単位で出力するため、複数回foo
表示されます。extern_C_inline
c++ - インライン関数本体の潜在的な評価とテンプレート メンバーのインスタンス化
インラインとマークされた関数内に含まれる式は、いつ「潜在的に評価される」と見なされますか?
a.cpp
b.cpp
$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin
インライン関数が定義されるとすぐに式が「潜在的に評価される」と見なされる場合、テンプレートをインスタンス化する必要があり、リンクが正常に行われると予想されます。代わりに、インラインで宣言された関数内の式が、そのような関数自体が ODR で使用されるようになったときにのみ「潜在的に評価される」ようになる$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin
場合、リンク ステップで失敗することが予想されます。
これまでのところ、xl C++ 12 (リンクに成功) とさまざまなバージョンの gcc + clang 3.5 (すべてリンクに失敗) をテストしました。
正しい動作はどれですか? ここで 3 番目のオプションがありませんか?
c - Keil ARM C コンパイラ: インライン関数に関する問題
リアルタイム カーネルTNeoKernelを Cortex-M アーキテクチャに移植しているので、Keil をインストールしてカーネルをビルドしようとしています。ただし、予期しない問題に直面しています。コンパイラがinline
関数を処理できないようです。簡単なコードは次のとおりです。
コンパイラの出力は次のとおりです。
キーワードを削除するinline
と、コンパイルして動作します。
ARM Compiler のドキュメントでは、関数について何も見つかりませんinline
。念のために言っておくと、inline
キーワードは ARM コンパイラでサポートされていないのでしょうか? あまりにも信じられないので、質問することにしました。
カーネルのプラットフォームに依存しないコードに多くのstatic inline
関数があるので、ARM コンパイラをサポートする最善の方法は何ですか? 頭のてっぺんから、2つのアイデアしかありません。
- のようなアーキテクチャ依存のマクロを作成
TN_INLINE
し、ARM コンパイラの場合は何も展開しないようにする必要があります。 - 非常に小さな 1 行の関数をマクロに変換します。
c++ - 「インライン」キーワードと「インライン化」の概念
記録を正すために、この基本的な質問をしています。この質問と現在受け入れられている回答を参照しましたが、説得力がありません。ただし、2 番目に投票数の多い回答は、より良い洞察を提供しますが、完璧でもありません。
inline
以下を読みながら、キーワードと「インライン化」の概念を区別してください。
これが私の見解です:
インライン化の概念
これは、関数の呼び出しオーバーヘッドを節約するために行われます。これは、マクロ スタイルのコード置換に似ています。異論の余地はありません。
inline
キーワード_
知覚A
inline
キーワードは、通常は小さな関数に使用されるコンパイラへの要求であるため、コンパイラはそれを最適化し、より高速な呼び出しを行うことができます。コンパイラはそれを自由に無視できます。
以下の理由により、私はこれに異議を唱えます。
inline
より大きな再帰関数はインライン化されず、コンパイラはキーワードを無視します。- 小さい関数は、
inline
キーワードが言及されているかどうかに関係なく、オプティマイザーによって自動的にインライン化されます。
ユーザーがキーワードを使用して関数のインライン化を制御できないことは明らかですinline
。
知覚B
inline
インライン化の概念とは何の関係もありません。インライン化されているため、大きな/再帰関数を前に置いinline
ても役に立たず、小さな関数は必要ありません。の唯一の決定論的な使用法は、 One Definition Rule
inline
を維持することです。
つまり、関数がで宣言されている場合、inline
以下のもののみが義務付けられています:
- その本体が複数の翻訳単位で見つかった場合でも (たとえば、そのヘッダーを複数の
.cpp
ファイルに含める場合)、コンパイラは 1 つの定義のみを生成し、複数のシンボル リンカー エラーを回避します。(注: その関数の本体が異なる場合、それは未定義の動作です。) - 関数の本体は、
inline
それを使用するすべての翻訳単位で表示/アクセス可能でなければなりません。つまり、あるファイルで関数を宣言してinline
定義.h
すると、他のファイルで「未定義のシンボル リンカ エラー」が発生します。.cpp
.cpp
評決
「A」の認識は完全に間違っており、「B」の認識は完全に正しいです。
これについて標準でいくつかの引用がありますが、この評決が真か偽かを論理的に説明する答えを期待しています。
c - インライン関数を理解しようとする
私は次の機能を研究しています:
この機能を構成するもの、つまり変数に計算して格納するものを知りたいだけですt
。