C++ ではコンストラクターとデストラクターをインライン関数にすることができますか?
-
09-06-2019 - |
質問
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 つは、仮想関数は決してインライン化されないということです。基本クラスに仮想コンストラクター/デストラクターがある場合、おそらくインライン化されることはありません。