誰かがそれらが何であるか、なぜ私がそれらを必要とするのかを説明できますか?組み込み関数を使用する必要がある場合、どのようなアプリケーションを構築していますか?
通常、「組み込み」とは、組み込みの関数を指します。つまり、ライブラリ内の実際の関数を呼び出す代わりに、コンパイラがインラインで生成できる/生成するほとんどの標準ライブラリ関数を指します。たとえば、次のような呼び出し:memset(array1, 10, 0)
は、x86用に次のようなものとしてコンパイルできます。
mov ecx, 10
xor eax, eax
mov edi, offset FLAT:array1
rep stosb
このような組み込み関数は、純粋に最適化です。 「必要な」組み込み関数は、コンパイラが直接生成できない(または通常は生成しない)コードを生成できるコンパイラ組み込み関数をサポートする状況である可能性が最も高いでしょう。明らかな例として、x86向けのかなりの数のコンパイラに「MMX組み込み関数」があり、MMX命令を直接表現しただけの「関数」を使用できます。
組み込み関数は、ライブラリーが提供する関数の実装にリンクするのではなく、可能な場合にコンパイラーが直接実装する関数です。
一般的な例はstrncpy()
です。
短い文字列の場合、戻りアドレスを使用して「スタックフレーム」を設定することを含むstrncpy()
への関数呼び出しを行うと、バイトの実際のコピーよりも時間がかかります。さらに悪いことに、CPUプリフェッチバッファへの影響により、CPUの実行が数クロックサイクル停止します。
代わりに、組み込み関数は、関数呼び出しの代わりにコンパイラーによって実装されます。 strncpy()
の例では、strncpy()
が呼び出された場所で直接バイトコピーコードが発行されます。
このstrncpy()
の例と同様に、必要な制約が満たされている場合、すべての組み込み関数はインラインコードとして直接実装されます。
関数のアドレスが必要な場合に備えて、組み込み関数の非組み込みコピーは通常、標準ライブラリにまだ存在しています。
インライン関数と比較して、組み込み関数はコンパイラーによって提供されます。 Cプログラムのソースコードには、組み込み関数が記述されている場所もなければ、リンクする必要のあるライブラリ実装もありません。インライン関数は、コンパイラがインライン関数のソースコードを読み取るという点で異なりますが、後でインライン関数のコンパイルされた変換をオブジェクトコードに直接出力し、関数呼び出しのオーバーヘッドを省略できる点が似ています。
つまり、組み込み関数とインライン関数の実際的な違いは、関数宣言を含む必要なヘッダーファイルを#include
していない場合でも、組み込み関数が「存在する」ということです。インライン関数の場合、関数宣言を含むヘッダーファイルを最初に#include
'd(またはその他の方法で宣言)する必要があります。
組み込み関数は、コンパイラーによって、ライブラリーの一部ではない関数per seとして公開されます。
おそらく最もよく使用するのはアセンブリ組み込み関数であり、コンパイラによって、それらが表す機械命令として正確に扱われます。たとえば、コンパイラが自動的に生成しない特定のCPU命令を利用する必要があり、必ずしも完全なインラインアセンブリセクションを必要としないコードで、これらを使用します。
''組み込み関数 ''は、プログラムが宣言する必要なくコンパイラが認識および実装する言語の機能です。コンパイラは、ランタイムライブラリにリンクして、操作を実行する場合としない場合があります。たとえばC++では、構造体のコピー操作は暗黙的です。
struct {
int a;
char b [100];
long c [27];
} s, t;
...
s = t; // this statement copies hundreds of bytes, likely with a rtl call
他の例としては、複合型を暗黙的にサポートするFortranなどの言語があり、超越関数(サイン、タンジェントなど)を宣言する必要はなく、宣言することもできません。 PHP、Javascript、Rubyなどには、配列の作成と検索、正規表現一致の実行など、何百もの組み込み関数があります。
他の質問と同様に、唯一の違いは、それらを宣言する必要があるかどうかです。たとえば、超越関数を使用するC++プログラムには、数学ライブラリ宣言を含める必要があります。
#include <math.h>
組み込み関数に依存するアプリケーションの特定のパターンはありません。これは、コンパイラの作成者とプログラマにとって重要なことです。