0

フリー関数を呼び出すクラス メンバー関数があるとします。

class MyClass
{
public:
  void func1() {func2();}
};

func2インラインであるため、コンパイラが ( )内の関数をインライン化する可能性があるかどうか知りたいfunc1です。

4

5 に答える 5

2

事実func2がインライン化されるかどうかは、func2 の複雑さに依存します。func1 がインライン化されているかどうかは、f2 展開 (存在する場合) 後の複雑さに依存します。

インライン化は本質的にコンパイラの最適化であり、関数定義がソース内でインライン化されている (したがって繰り返し可能である) かどうかに依存しません。

于 2013-06-04T14:00:39.257 に答える
1

コンパイラと状況に依存します。

コンパイラは、以下に基づいて関数をインライン化することを決定します。

  1. コードの可視性。明らかに、コンパイラが [1] のソース コードを持たない関数をインライン化することはできません。
  2. コードのサイズ。大きな関数は、小さな関数よりもインライン化される可能性が低くなります。
  3. 関数の呼び出し回数。小さな関数の場合、何百回も呼び出されてもインライン化される可能性があります。複数回呼び出される大きな関数は、おそらくインライン化されません。少なくとも GCC には、「関数は 1 回だけ呼び出される」という特別なケースがあります。その特別なケースでは、巨大な関数もインライン化されます。

したがって、この場合、func2がコンパイラに認識され、コンパイラがインライン化しても問題ないと判断できるほど小さい場合は、おそらくそうなるでしょう。

于 2013-06-04T14:01:19.453 に答える
0

インライン化の動作は完全に実装定義です。コンパイラは、何をすべきかを決定するために、独自のヒューリスティックを無視するか、尊重するか、または使用するかを自由に選択できます。

求められていないのにコンパイラが実行することがあります:コンパイラが C++ コードをインライン化するのはいつですか?

時々、コンパイラはそれを無視します: https://softwareengineering.stackexchange.com/questions/35432/inline-functions-in-c-whats-the-point

于 2013-06-04T14:00:33.977 に答える