このC ++クラス含む可変サイズの配列は、動的なメモリ割り当てを使用していますか?
-
23-08-2019 - |
質問
この使用動的なメモリ割り当てのようなものをやっていますか?
template <class T, int _size>
class CArray
{
public:
...
private:
T m_data[_size];
};
誰かが、私は、オブジェクトを作成するときに舞台裏で何が起こっているか私に説明できますか?
CArray<SomeObject, 32> myStupidArray;
解決
、テンプレートはコンパイル時に評価されています。もし興味がある場合は、そのサイズを確認することができますどこにクラス階層を吐き出す++グラムを持つことができます:
template <class T, int _size>
class CArray
{
public:
private:
T m_data[_size];
};
int main(int argc, char **argv) {
CArray<int, 32> myStupidArray1;
CArray<int, 8> myStupidArray2;
CArray<int, 64> myStupidArray3;
CArray<int, 1000> myStupidArray4;
}
-fdump-class-hierarchy
でコンパイルします:
g++ -fdump-class-hierarchy blah.cc
カレントディレクトリにblah.cc.t01.class
という名前のファイルがあるはずです
Class CArray<int, 32>
size=128 align=4
base size=128 base align=4
CArray<int, 32> (0x40be0d80) 0
Class CArray<int, 8>
size=32 align=4
base size=32 base align=4
CArray<int, 8> (0x40be0e80) 0
Class CArray<int, 64>
size=256 align=4
base size=256 base align=4
CArray<int, 64> (0x40be0f80) 0
Class CArray<int, 1000>
size=4000 align=4
base size=4000 base align=4
CArray<int, 1000> (0x40be6000) 0
他のヒント
いいえ、それは(例えば、いずれかのスタック上、または含むオブジェクトの一部として)インプレース割り当てられます。
あなたのコードが有効になるようにパラメータは、コンパイル時に評価されているテンプレートを使用して、
class CArray
{
public:
...
private:
SomeObject m_data[32];
};
テンプレートのコンパイル時に評価されているrel="nofollow M_DATAとしてコンパイル[32]。
いいえ、それは動的なメモリ割り当てを使用していません。コンパイラは、それがコンパイル時ではなく、実行時に決定され、メモリを割り当てる必要がどのくらい知っています。
これは、ここにC ++のテンプレートを説明するために、任意の意味をなさない、彼らは<のhref = "http://www.parashift.com/c++-faq-lite/templatesのように、他のページでかなりよく説明されています。 HTMLの#のFAQ-35.1" のrel = "nofollowをnoreferrer"> C ++よくある質問liteののます。
配列のサイズは、コンパイル時に知られているので、いいえ、それはここで動的なメモリ割り当てを使用しません。あなたは、関数のスコープで配列を宣言すると、それだけで、その他の型のオブジェクトと同様にスタックに置かれます。
あなたはこのような可変サイズのオブジェクトを定義すると、、本当に起こっていることは、コンパイラは「注文に」クラス定義を構築しているということです。あなただけの「[32] TはM_DATA」が、その中に含まれているクラス定義を使用しています。
の1-テンプレートはコンパイル時にのみ評価されます。したがって、この配列のサイズが32のものであろう。
2 - あなたは、変数を使用して、スタック上のアレイを作成することはできません、それはあなたが新しい(またはmalloc関数)を使用することができる他、コンパイル時に評価することができ、一定でなければなりません。
ダイナミックメモリ割り当てあなたはnew
演算子(またはその友人の一人)を呼び出すとき、通常発生します。これは、一般に、ヒープと呼ばれるメモリリザーブからメモリのチャンクを割り当てます。静的割り当てとは異なり、コンパイラは自由INGのメモリの世話をしていないので、あなたがdelete
演算子(またはその適切なバージョン)を使用して手動でそれをしなければならないことに注意してください。