3

インライン関数とメインの違いは何ですか:

inline double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

対次のように定期的に関数を宣言するだけです:

double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

対関数プロトタイプ?

double cube(double);

int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}
4

4 に答える 4

6

関数は複数の翻訳単位 (cpp ファイル + インクルード) で定義でき、inline関数をインライン化するためのコンパイラへのヒントになります。これは通常、コンパイル時間が長くなるヘッダーに配置されますが、コードの高速化につながる可能性があります。また、多くのコンパイル ユニットから関数を使用することもできます。

//cube.h
inline double cube(double side)
{
   return side * side * side;
}

//cube.cpp
int main( )
{
    cube(5);
}

定期的に定義するのが通常の方法で、(通常は) cpp ファイルで定義され、リンクされます。他のコンパイル単位からは簡単に使用できません。

//cube.cpp
double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

プロトタイプを使用すると、関数がまだ存在していなくても、リンク時に関数が存在することをコンパイラに伝えることができます。これにより、main は関数がまだ存在していなくても呼び出すことができます。通常、プロトタイプはヘッダーにあるため、他のコンパイル ユニットは関数自体を定義せずに関数を呼び出すことができます。これはコンパイル時間が最速であり、この関数は他のコンパイル ユニットから簡単に使用できます。

//cube.h
double cube(double);

//cube.cpp
int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}
于 2011-10-27T21:06:24.010 に答える
1

パフォーマンスinlineに関しては、コンパイラのヒントに過ぎないため、それらはすべて同じです。宣言/定義の分離が使用され、定義が別の翻訳単位にある場合、コンパイラがそれをインライン化するのが難しくなります (ただし、そうする実装があります)。

関数を作成するかどうかの違いは、関数inlineの同じインライン定義が複数回見られてもリンカが文句を言わないことです。

于 2011-10-27T21:05:30.120 に答える
1

3つのプログラムは、とまったく同じにコンパイルされg++ -S -O3 $file.ccます。double cube(double side)の定義がにインライン化されていても、インライン化されていない形式でまだ存在する 2 番目の例を除きint main()ます。

_main:
pushl   %ebp
movl    $16, %eax
movl    %esp, %ebp
subl    $8, %esp
andl    $-16, %esp
call    __alloca
call    ___main
leave
xorl    %eax, %eax
ret
于 2011-10-27T21:55:14.560 に答える
0

関数をインラインで宣言すると、コンパイラは、関数の本体を呼び出された場所に多かれ少なかれコピーすることで、コードを高速化しようとします。これは単なる提案であり、可能かどうかを決定するのはコンパイラ次第です。

3番目の例で何が起こるかわかりません。使用されているツールチェーンに依存すると思います。

于 2011-10-27T21:08:24.283 に答える