問題タブ [inlining]
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.
delphi - Delphi 2010 のインライン展開は役に立たない?
Delphi で関数やプロシージャをインライン化するとどうなりますか (具体的にはここでは v2010 ですが、Turbo Delphi でも同じ問題がありました)。
ヘルプには、それが意味する「特定の基準」のために、常に関数をインライン化するとは限らないといういくつかの免責事項があります。
しかし、関数をインライン展開すると (コードが 3 ~ 4 行の非常に単純なものであっても)、コードの速度が上がるどころか遅くなることがわかっています。
素晴らしいアイデアは、「すべてをインライン化する」コンパイラ オプションです。実行速度を上げるために exe が 50% ほど大きくなってもかまいません。
コンパイラによってインライン化されることが決定されていない場合でも、Delphi に実際にコードをインライン化させる方法はありますか? それは本当に役に立ちます。それ以外の場合は、「//ここでインライン化に失敗したため、次の 5 行を変更する場合は、このコードが存在する他の 8 つの重複箇所でそれらを変更してください。 "
ここにヒントはありますか?
c++ - インライン非メンバー関数内のローカルクラスは、MSVC2005でLNK2005を生成します
どうやら、MSVC2005はローカルクラスのメンバー関数をインライン化できず、LNK2005につながります。
以下をコンパイルするときに、このLNK2005エラーに直面しています。
common.h
コンテンツ:
foo.cpp
コンテンツ:
bar.cpp
コンテンツ:
LNK2005.cppコンテンツ:
エラーメッセージは次のとおりです。
ローカルクラスについて、ISOIEC14882-2003は次のように述べています。
9.8ローカルクラス宣言
クラスは関数定義内で定義できます。このようなクラスはローカルクラスと呼ばれます。ローカルクラスの名前は、それを囲むスコープに対してローカルです。ローカルクラスは、囲んでいるスコープのスコープ内にあり、囲んでいる関数と同じように、関数の外部の名前にアクセスできます。ローカルクラスの宣言では、型名、静的変数、外部変数と関数、および囲んでいるスコープの列挙子のみを使用できます。
囲み関数には、ローカルクラスのメンバーへの特別なアクセス権はありません。通常のアクセスルール(11節)に従います。ローカルクラスのメンバー関数は、定義されている場合は、クラス定義内で定義されるものとします。
私は何か見落としてますか?
私には、コンパイラのバグのように見えます。GCCとMSVC2008はそれをうまくコンパイルします。ただし、実際にコールをインライン化するのか、リンクフェーズ中に2つのシンボルの1つを破棄するだけなのか疑問に思います。興味深いことに、このローカルクラスメンバー関数への呼び出しさえないことに気付くでしょう。
MSVC2005の回避策があるかどうか疑問に思います。私はMSDNでこの典型的な問題を検索しようとしましたが、あまり成功しませんでした。コンパイラの既知のバグのリストを見つけることさえできませんでした。
添付ファイル:LNK2005.zip
gcc - 関数をインライン化するための適切なヒューリスティックは何ですか?
速度のみを最適化しようとしていることを考えると、関数をインライン化するかどうかを決定するための優れたヒューリスティックは何ですか? 明らかにコードサイズは重要ですが、(たとえば) gcc または icc が関数呼び出しをインライン化するかどうかを決定するときに通常使用される他の要因はありますか? この分野で重要な学術研究はありましたか?
c++ - ヘッダーで定義された関数はインライン化されることが保証されていますか?
ヘッダーで非メンバー関数を定義すると、コンパイラによって常にインライン化されますか?それともコンパイラはヒューリスティックに基づいて選択しますか? __inline は単なるヒントであることは知っていますが、ヘッダー内の関数と同じですか?
delphi - Delphi コンパイラがアセンブリ関数をインライン化しないのはなぜですか?
時々、次のような非常に短いアセンブリ関数を記述します
インライン化に最適な候補と思われるもの:
しかし、Delphi コンパイラはそれを許可しません。なんで?
更新しました:
ldsandon のおかげで、QC に関する 5.5 年前の公開レポートが存在します。レポートには、コンパイラの asm インライン化を簡素化するためのいくつかの提案 (asm ディレクティブの拡張など) が含まれています。プロシージャ/関数レベルで「naked」ディレクティブを導入することをお勧めします。これは、プロシージャのスタック フレームを作成する必要がなく、オプションでどのレジスタ (eax、edx、および ecx) を保持する必要があるかをコンパイラに伝えるものです。
BASM コードを使用した効率的なインライン プロシージャの一般的なタスクが難しい (そして不要な場合がある) 場合は、最も重要なケース (レジスタの使用が明示的に宣言されたネイキッド関数など) でインライン化を有効にすることをお勧めします。
linker - LLVMをライブラリの関数にインライン化する
LLVM
ライブラリからインライン関数を作成しようとしています。
とリンクしたLLVMビットコードファイル(手動で生成)があります。llvm-link
また、によってビットコードにコンパイルされclang
、アーカイブされたライブラリ(Cで記述)もありllvm-ar
ます。LLVM
すべてをリンクして実行することはできますが、ライブラリから関数をインライン化することはできません。これをどのように行うべきかについての手がかりはありますか?
c - インライン化警告の抑制
次のような inling 警告が表示されます。
これを取り除くために、私はこれを取り除くために -Winline を削除するメイクファイルを変更しました。インライン化の警告は表示されません。しかし、パフォーマンスに関しては、どのように行うのが賢明かわかりません。誰か私にそれについて提案してもらえますか?
さらに情報を追加しました:
ここに警告があります:
対応するコードは次のとおりです。
list.h から
そしてsearch.cから
c++ - C++ 関数ポインターのインライン化
関数ポインターをテンプレート パラメーターとして渡してインライン呼び出しを取得できることはわかっていますが、最近のコンパイラで次のような「明白な」インライン化可能な関数をインライン化できるかどうか疑問に思いました。
Visual Studio 2008 では、それを直接呼び出し命令に落とし込むのに十分なほど巧妙なので、さらに一歩進めることができないのは残念ですか?
c# - C# でのインライン展開
C# で DirectX 3D エンジン用の数学ライブラリに取り組んでいます。私は、素晴らしくまとめられた強力なライブラリであるSlimDXを使用しています。SlimDX はかなりの数の数学クラスを提供しますが、それらは実際にはネイティブ D3DX オブジェクトのラッパーであるため、オブジェクト自体は非常に高速ですが、相互運用性はないと思います。なぜなら、私のマネージ C# コードがそれらより優れているからです。
私の特定の質問は、浮動小数点の比較に関係しています。一種の標準的な方法は、イプシロン値を定義し、その値を浮動小数点値の差と比較して、次のように近さを判断することです。
関数呼び出しのオーバーヘッドが実際の比較を圧倒するため、この単純な関数は C++ でインライン化されます。C# コンパイラはこれを行いますか? メソッドをインライン化する必要があることを C# コンパイラに伝える方法はありますか?
c++ - ラムダ式をインライン化することは可能ですか?
パフォーマンス上の理由からラムダ式は非常に短いため、インライン化したいと思います。出来ますか?