Enthält diese C ++ Klasse eine variable Größe Array mit dynamischen Speicherzuweisung verwenden?

StackOverflow https://stackoverflow.com/questions/554476

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;
War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top