0

インラインの機能を完全に理解しようとしていますが、コンストラクターに関しては混乱します。これまでのところ、関数をインライン化すると、関数が呼び出された場所に配置されることがわかりました。

class X {
public:
     X() {}
     inline void Y() { std::cout << "hello" << std::endl; }
};
int main() {
     X x;
     x.Y; //so instead of this it will be: "std::cout << "hello" << std::endl;"
}

しかし、これは何をしますか (これはどのように置き換えられますか?):

class X {
public:
     //or inline if the compilers feeling friendly for this example
     __forceinline X() {} 
}
4

1 に答える 1

3

の意味はinline、問題の関数がこの翻訳および他の翻訳単位で定義されることをコンパイラに通知することです。コンパイラは、この情報を次の 2 つの目的で使用します。

  1. 翻訳単位の関数を外部から見える一意のシンボルとして定義しません。つまり、シンボルが複数回定義されているというエラーは発生しません。
  2. 関数を呼び出して関数にアクセスするか、それが使用されているコードを拡張するかについての見解が変わる可能性があります。実際にコードをインライン化するかどうかは、コンパイラが何をインライン化できるか、何をインライン化するのが合理的であるか、そしておそらく月の満ち欠けに依存します。

インライン化される関数の種類に関して違いはありません。つまり、コンストラクター、メンバー関数、通常の関数などであるかどうかです。

ところで、クラス定義内で定義されたメンバー関数は暗黙的に宣言されていinlineます。明示的に言及する必要はありません。__forecedinlineコンパイラの拡張機能のようであり、それが何をインライン化するかを決定するのは人間よりもコンパイラの方がはるかに優れているため、それが言うことを行うと仮定するのはおそらく悪い考えです。

于 2013-08-03T20:34:54.387 に答える