Enthält diese C ++ Klasse eine variable Größe Array mit dynamischen Speicherzuweisung verwenden?
-
23-08-2019 - |
Frage
Ist so etwas wie diese Verwendung dynamische Speicherzuweisung zu tun?
template <class T, int _size>
class CArray
{
public:
...
private:
T m_data[_size];
};
Kann mir jemand erklären, was hinter den Kulissen vor sich geht, wenn ich das Objekt erstellen?
CArray<SomeObject, 32> myStupidArray;
Lösung
Wie in den anderen Antworten erwähnt, Vorlagen werden bei der Kompilierung ausgewertet. Wenn Sie interessiert sind, können Sie g haben ++ die Klassenhierarchie ausspucken, wo man seine Größe überprüfen können:
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;
}
Übersetzen mit -fdump-class-hierarchy
:
g++ -fdump-class-hierarchy blah.cc
Es sollte eine Datei mit dem Namen blah.cc.t01.class
im aktuellen Verzeichnis sein:
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
Andere Tipps
Nein, wird sie an Ort und Stelle zugeordnet werden (beispielsweise entweder auf dem Stapel, oder als Teil eines enthaltenden Objekts).
Mit Vorlagen der Parameter ausgewertet werden zur Compile-Zeit, damit Ihr Code wirksam wird;
class CArray
{
public:
...
private:
SomeObject m_data[32];
};
Vorlagen werden bei der Kompilierung ausgewertet, so m_Data [_size] ist kompiliert als m_Data [32].
Nein, ist es nicht dynamische Speicherzuweisung verwenden. Der Compiler weiß, wie viel Speicher zugewiesen werden muss, ist es zur Compile-Zeit entschieden wird, nicht zur Laufzeit.
Es macht keinen Sinn, C ++ Vorlagen hier zu erklären, sind sie auf anderen Seiten ziemlich gut erklärt, wie in der C ++ FAQ lite .
Die Größe des Arrays wird bei der Kompilierung bekannt ist, also nein, es wird nicht dynamische Speicherzuweisung hier werden. Wenn Sie das Array in einem Funktionsumfang erklären, dann wird es wie jede andere Art von Objekt auf dem Stapel gelegt werden.
Wenn Sie mit variabler Größe Objekte wie diese zu definieren, was wirklich passiert ist, dass der Compiler eine Klassendefinition baut ‚auf Bestellung‘. Sie müssen nur eine Klassendefinition verwenden, die ‚T m_Data [32]‘ in es enthält.
1- Vorlagen werden nur bei der Kompilierung ausgewertet. So wird diese Reihe von Größe 32
2- Sie können ein Array auf dem Stapel erstellen Sie eine Variable verwenden, es muss eine Konstante sein, die zum Zeitpunkt der Kompilierung ausgewertet werden können, sonst kann man neue (oder malloc)
Dynamische Speicherzuweisung tritt normalerweise auf, wenn Sie den new
Operator (oder einer seiner Freunde) nennen. Dies ordnet einen Teil des Speichers von einer Speicherreserve als Haufen allgemein bezeichnet. Beachten Sie, dass im Gegensatz zu statischen Allokation der Compiler nicht aufpasst, der frei-ing das Gedächtnis und so haben Sie es tun manuell den delete
Operator (oder eine geeignete Version davon).