2016-07-21 33 views
0

Nehmen wir zum BeispielWo (in welchem ​​Speichersegment) sind Objekte (einer Klasse) in C++ gespeichert?

class Shape{ 
    public: 
     Circle (int x): number(x){} 
     virtual area() {return x**2;} 

    private: 
     int number; 
} 

Im Haupt schaffen wir die Objekte

int main(){ 
    Shape *foo = new Shape(8); 
    Shape *bar = new Shape(65); 
    Shape &obj1 = *foo, &obj2 = *bar; 
} 

ich die folgende Klasse nehmen glauben, dass die Objekte 1 und 2 in dem Heap gespeichert sind. Warum das? Als eine Nebenfrage. Beeinflusst das Schlüsselwort virtual bzw. die Art und Weise, wie Objekte definiert werden (zB obj1 = * foo), deren Positionierung im Speicher?

+9

'foo' und' bar' haben dynamische Speicherdauer und werden im * freestore * gespeichert. Die C++ - Sprachspezifikation erwähnt * "Heap" * nicht als Speicher. 'obj1' und' obj2' sind ** Referenzen **. Sie sind Aliase für vorhandene Objekte und existieren nur während der Kompilierzeit (wie alle Variablen). Sie werden (normalerweise) nicht in dem ausführbaren Bild oder Speicher zur Laufzeit reflektiert. – IInspectable

+0

Referenz: http://stackoverflow.com/questions/10157122/object-creation-on-the-stack-heap –

Antwort

0

Es gibt (allgemein) zwei Arten von Objekten W.R.T. ihre Speicherverwaltung:

  1. Eine Objekte vollständig während der Kompilierung konstruiert werden
  2. Ein Objekt nur dann voll einige Informationen aufgebaut werden kann verwenden, die erst nach dem Programm nicht verfügbar ist, wird
  3. laufen

Zum Beispiel Jedes Objekt des Typs constexpr kann während des Kompilierens vollständig ausgewertet und konstruiert werden und als solches in ein Speicherdatensegment als Optimierung eingefügt werden (aus puristischer Sicht ist es zulässig, aber nicht optimal, solche Objekte während des Laufs zu konstruieren -time, aber das wird CPU-Zyklen verschwenden und die Initialisierung/Startup machen länger).

Hier sind ein paar Beispiele für solche Objekte:

const char * const helloWorld = "Hello, world!"; 
struct TSilly{ 
    TSilly(int _i = 0) : i(_i) {} 
    int i; 
}; 
const TSilly silly1; 
const TSilly silly2(42); 
TSilly silly3; // doesn't have to be constexpr to qualify for static allocation. 
       // This one you can declare as /*extern TSilly silly3;*/ in 
       // header file and access from other compilation units 
static TSilly silly4; // can be local to compilation unit, too 

int main() 
{ 
    return 0; 
} 

Alle anderen Objekte warten müssten, bis die Laufzeit gebaut werden.

Beispiele solcher Objekte:

const char * exeName1; // statically allocated by compiler 

int main(int argc, char **argv) 
{ 
    exeName1 = argv[0]; // now points to a string 

    // buffer is allocated in free storage (heap) bu variable itself is on stack 
    char * exeName2 = new char[strlen(argv[0] + 1]; 
    strcpy(exeName2, argv[0]); // now contains a COPY of a string 

    char exeName3[1024]; // likely allocated on stack, be careful with that as stack space is limited 
    strncpy(exeName3, argv[0], 1024); // will COPY at most 1023 characters from a string 

    delete [] exeName2; // don't forget to clean up 
    // exename3 will be auto-cleaned when we exit the function 

    return 0; 
} 

Wie man ein Objekt in C++ wird ein Datensegment in setzen oder in einen freien Speicher (heap) in Abhängigkeit von der Laufzeit werden sehen kann.

Nur die dynamisch zugewiesenen Objekte werden garantiert in den freien Speicher gesetzt werden. Ich denke nicht, dass die Spezifikation eine Versprechung der Verwendung von Datensegmenten für statisch zugewiesene Objekte verspricht - es ist Aufgabe des Compilers, diese Optimierung durchzuführen und zu nutzen.

Für weitere Informationen Goggle "C++ Speicherklassen".

Es gibt viele fortschrittliche Speicher-Management Themen, die Sie wollen, könnten schauen. Der relevanteste für diese Diskussion ist wahrscheinlich der In-Place-Konstruktor, mit dem Sie ein Laufzeitobjekt in einem Speicher erstellen können, der im Datensegment der ausführbaren Datei zugeordnet ist.

+0

In meinem Beispiel, was rendert die Objekte dynamisch zugeordnet? –

+0

Was meinst du? Könnten Sie Ihre Frage anders stellen? – YePhIcK