ループを含む関数をインライン化できないのはなぜですか? パフォーマンスの問題によるものですか、それとも他の理由がありますか?
2 に答える
ループを展開できない場合でも、ループを含む関数をインライン化できます。そうでないと言っている人は誰でも間違っています。
ループのある関数はインラインで作成できますが、関数が呼び出されるたびに、ある程度のパフォーマンスオーバーヘッドが発生します。これは、CPUが実行中の現在の命令のアドレスを他のレジスタとともに保存する必要があり(したがって、後でどこに戻るかを認識しているため)、すべての関数パラメータを作成して値を割り当て、プログラムをに分岐する必要があるためです。新しい場所。インプレースで記述されたIlineコードは大幅に高速です。
コードの膨張の可能性があるため、関数のインライン化は、通常はループ内で呼び出され、分岐しない短い関数(たとえば、数行以内)に最適です。また、インラインキーワードは単なる推奨事項であることに注意してください。コンパイラは、関数をインライン化する要求を自由に無視できます。これは、長い関数をインライン化しようとした場合の結果である可能性があります。
C ++は、関数の利点とインプレースで記述されたコードの速度を組み合わせる方法を提供します。インライン関数です。inlineキーワードは、コンパイラーが関数をインライン関数として扱うように要求するために使用されます。コンパイラがコードをコンパイルすると、すべてのインライン関数がインプレースで展開されます。つまり、関数呼び出しが関数自体の内容のコピーに置き換えられ、関数呼び出しのオーバーヘッドがなくなります。欠点は、インライン関数が関数呼び出しごとにインプレースで拡張されるため、特にインライン関数が長い場合やインライン関数への呼び出しが多い場合に、コンパイルされたコードがかなり大きくなる可能性があることです。
#include <iostream>
#include <ctime>
using namespace std;
inline void inlineFunction()
{
int loopCounter = 0;
while(loopCounter<5 )
{
loopCounter++;
cout<<"Inline loop "<<loopCounter<<" \n";
}
}
void regularFunction()
{
int loopCounter = 0;
while(loopCounter<5 )
{
loopCounter++;
cout<<"regular "<<loopCounter<<" \n";
}
}
int main()
{
clock_t start;
clock_t end;
clock_t duration;
cout << "Running inline function ..." << endl;
start = clock();
inlineFunction();
end = clock();
duration = end - start;
cout << "Time elapsed: " << duration << " ticks. \n" << endl;
cout << "Running function ..." << endl;
start = clock();
regularFunction();
end = clock();
duration = end - start;
cout << "Time elapsed: " << duration << " ticks.\n" << endl;
system("pause");
return 0;
}