84

それらが何であり、なぜ私がそれらを必要とするのかを誰か説明できますか? 組み込み関数を使用する必要がある場合、どのような種類のアプリケーションを構築していますか?

4

4 に答える 4

88

組み込み関数は、ライブラリが提供する関数の実装にリンクするのではなく、可能な場合はコンパイラが直接実装する関数です。

一般的な例はstrncpy()です。

短い文字列の場合strncpy()、リターンアドレスを使用して「スタックフレーム」を設定することを含む、への関数呼び出しを行うと、実際のバイトのコピーよりも多くの時間がかかります。さらに悪いことに、CPUプリフェッチバッファへの影響により、CPUの実行が数クロックサイクル停止します。

代わりに、組み込み関数は、関数呼び出しの代わりにコンパイラーによって実装されます。の例では、バイトコピーコードは呼び出さstrncpy()れた場所で直接発行されます。strncpy()

このstrncpy()例と同様に、必要な制約が満たされている場合、すべての組み込み関数はインラインコードとして直接実装されます。

関数のアドレスが必要な場合に備えて、組み込み関数の非組み込みコピーは通常、標準ライブラリにまだ存在します。

インライン関数と比較して、組み込み関数はコンパイラーによって提供されます。Cプログラムのソースコードには、組み込み関数が記述されている場所はなく、リンクする必要のあるライブラリ実装もありません。インライン関数は、コンパイラがインライン関数のソースコードを読み取るという点で異なりますが、後で関数呼び出しのオーバーヘッドを省略して、インライン関数のコンパイル済み変換をオブジェクトコードに直接出力する可能性があるという点で類似しています。

要するに、組み込み関数とインライン関数の実際的な違いは#include、関数宣言を含む必要なヘッダーファイルがなくても、組み込み関数が「存在する」ということです。インライン関数の場合、関数宣言を含むヘッダーファイルを#include最初に'd(または宣言)する必要があります。

于 2010-02-15T20:07:19.433 に答える
62

通常、「組み込み関数」とは、組み込み関数、つまり、ライブラリ内の実際の関数を呼び出す代わりに、コンパイラがインラインで生成できる/生成するほとんどの標準ライブラリ関数を指します。たとえば、次のような呼び出しmemset(array1, 10, 0)は、x86用に次のようにコンパイルできます。

 mov ecx, 10
 xor eax, eax
 mov edi, offset FLAT:array1
 rep stosb

このような組み込み関数は、純粋に最適化です。「組み込み関数が必要」とは、コンパイラーが直接生成できない(または通常は生成しない)コードを生成できる組み込み関数をコンパイラーがサポートしている状況である可能性があります。明らかな例として、x86用のコンパイラのかなりの数が「MMX組み込み関数」を備えており、実際にはMMX命令を直接表現した「関数」を使用できます。

于 2010-02-15T20:06:20.823 に答える
12

組み込み関数は、それ自体がライブラリの一部ではない関数としてコンパイラによって公開されます。

おそらく最もよく使用するのは、アセンブリ組み込み関数であり、コンパイラによって、それらが表すマシン命令として正確に扱われます。たとえば、コンパイラが自動的に生成しない特定のCPU命令を利用する必要があるコードや、完全なインラインアセンブリセクションを必ずしも必要としないコードでこれらを使用します。

于 2010-02-15T20:06:00.360 に答える