VC++ は、クラス宣言内で実装される関数をインライン関数にします。
次のようにクラスを宣言するFoo
と、CONSTRUCTOR および DESTRUCTOR インライン関数になりますか?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
VC++ は、クラス宣言内で実装される関数をインライン関数にします。
次のようにクラスを宣言するFoo
と、CONSTRUCTOR および DESTRUCTOR インライン関数になりますか?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
クラス内でコンストラクターの本体を定義すると、「inline」キーワードを使用してクラスの外に関数を配置するのと同じ効果があります。
どちらの場合も、それはコンパイラーへのヒントです。「インライン」関数は、必ずしも関数がインライン化されることを意味するわけではありません。これは、関数やその他のルールの複雑さに依存します。
簡単な答えはイエスです。任意の関数をインラインで宣言できます。関数本体をクラス定義に入れることは、そのための1つの方法です。次のこともできます。
class Foo
{
int* p;
public:
Foo();
~Foo();
};
inline Foo::Foo()
{
p = new char[0x00100000];
}
inline Foo::~Foo()
{
delete [] p;
}
ただし、実際に関数をインライン化するかどうかはコンパイラー次第です。VC ++は、インライン化の要求をほとんど無視します。それが良い考えであると考える場合にのみ、関数をインライン化します。リンクタイムコード生成を使用する場合、コンパイラの最近のバージョンでは、個別の.objファイルにあり、インラインで宣言されていないもの(たとえば、異なる.cppファイルのコードから)もインライン化されます。
__forceinlineキーワードを使用して、「この関数をインライン化する」と言ったときに本当に意味があることをコンパイラーに伝えることができますが、通常はそれだけの価値はありません。多くの場合、コンパイラは実際に最もよく知っています。
関数定義をクラス本体に配置することは、inlineキーワードで関数をマークすることと同じです。つまり、関数はコンパイラによってインライン化される場合とされない場合があります。だから私は最良の答えは「たぶん」だろうと思いますか?
他の関数をインライン化できるのと同じ程度に、そうです。
インラインにするかどうかは、ほとんどの場合コンパイラによって決定されます。コード内のインラインは、コンパイラーへのヒントにすぎません。
信頼できるルールの1つは、仮想関数がインライン化されることは決してないということです。基本クラスに仮想コンストラクタ/デストラクタがある場合、おそらくインライン化されることはありません。