Es gibt (allgemein) zwei Arten von Objekten W.R.T. ihre Speicherverwaltung:
- Eine Objekte vollständig während der Kompilierung konstruiert werden
- Ein Objekt nur dann voll einige Informationen aufgebaut werden kann verwenden, die erst nach dem Programm nicht verfügbar ist, wird
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.
'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
Referenz: http://stackoverflow.com/questions/10157122/object-creation-on-the-stack-heap –