問題タブ [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.

0 投票する
1 に答える
3718 参照

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

0 投票する
1 に答える
148 参照

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 番目のオプションがありませんか?

0 投票する
1 に答える
3084 参照

c - Keil ARM C コンパイラ: インライン関数に関する問題

リアルタイム カーネルTNeoKernelを Cortex-M アーキテクチャに移植しているので、Keil をインストールしてカーネルをビルドしようとしています。ただし、予期しない問題に直面しています。コンパイラがinline関数を処理できないようです。簡単なコードは次のとおりです。

コンパイラの出力は次のとおりです。

キーワードを削除するinlineと、コンパイルして動作します。

ARM Compiler のドキュメントでは、関数について何も見つかりませんinline。念のために言っておくと、inlineキーワードは ARM コンパイラでサポートされていないのでしょうか? あまりにも信じられないので、質問することにしました。

カーネルのプラットフォームに依存しないコードに多くのstatic inline関数があるので、ARM コンパイラをサポートする最善の方法は何ですか? 頭のてっぺんから、2つのアイデアしかありません。

  • のようなアーキテクチャ依存のマクロを作成TN_INLINEし、ARM コンパイラの場合は何も展開しないようにする必要があります。
  • 非常に小さな 1 行の関数をマクロに変換します。
0 投票する
2 に答える
3399 参照

c++ - 「インライン」キーワードと「インライン化」の概念

記録を正すために、この基本的な質問をしています。この質問現在受け入れられている回答を参照しましたが、説得力がありません。ただし、2 番目に投票数の多い回答は、より良い洞察を提供しますが、完璧でもありません。

inline 以下を読みながら、キーワードと「インライン化」の概念を区別してください。

これが私の見解です:

インライン化の概念

これは、関数の呼び出しオーバーヘッドを節約するために行われます。これは、マクロ スタイルのコード置換に似ています。異論の余地はありません。

inlineキーワード_

知覚A

inlineキーワードは、通常は小さな関数に使用されるコンパイラへの要求であるため、コンパイラはそれを最適化し、より高速な呼び出しを行うことができます。コンパイラはそれを自由に無視できます。

以下の理由により、私はこれに異議を唱えます。

  1. inlineより大きな再帰関数はインライン化されず、コンパイラはキーワードを無視します。
  2. 小さい関数は、inlineキーワードが言及されているかどうかに関係なく、オプティマイザーによって自動的にインライン化されます。

ユーザーがキーワードを使用して関数のインライン化を制御できないことは明らかですinline

知覚B

inlineインライン化の概念とは何の関係もありません。インライン化されているため、大きな/再帰関数を前に置いinlineても役に立たず、小さな関数は必要ありません。

唯一の決定論的な使用法は、 One Definition Ruleinlineを維持することです。

つまり、関数がで宣言されている場合、inline以下のもののみが義務付けられています:

  1. その本体が複数の翻訳単位で見つかった場合でも (たとえば、そのヘッダーを複数の.cppファイルに含める場合)、コンパイラは 1 つの定義のみを生成し、複数のシンボル リンカー エラーを回避します。(注: その関数の本体が異なる場合、それは未定義の動作です。)
  2. 関数の本体は、inlineそれを使用するすべての翻訳単位で表示/アクセス可能でなければなりません。つまり、あるファイルで関数を宣言しinline定義.hすると、他のファイルで「未定義のシンボル リンカ エラー」が発生します。 .cpp.cpp

評決

「A」の認識は完全に間違っており、「B」の認識は完全に正しいです。

これについて標準でいくつかの引用がありますが、この評決が真か偽かを論理的に説明する答えを期待しています。

0 投票する
1 に答える
57 参照

c - インライン関数を理解しようとする

私は次の機能を研究しています:

この機能を構成するもの、つまり変数に計算して格納するものを知りたいだけですt