Die Deklaration Vektor als Globale variable in C++
Ist es eine gute Praxis, deklarieren Sie einen Vektor als Globale in C++?
Dies ist, was ich getan habe.
#include <vector>
std::vector<int> vec;
Mein Programm erfolgreich kompiliert, aber ich bin mir nicht sicher, ob dies dazu führen könnte, Laufzeit
Fehler unter bestimmten Umständen. Nach meinem Verständnis wird der Speicher für Globale variable zugewiesen werden, beim compilieren, und der compiler kann behalten Sie eine begrenzte Menge an Speicher, auf die dieser Vektor erweitern können. Bei erreichen dieses limit, was geschrieben wird können Essen, in den Speicherbereich einer anderen Variablen.
Bitte beraten.
Es ist nicht in der Regel gute übung, um zu erklären, nichts als eine Globale variable.
InformationsquelleAutor cpp_noname | 2011-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist dies sicher zu tun; die Lagerung für die
vec
variable zugewiesen werden, statisch und deren Standardkonstruktor aufgerufen wird irgendwann (Wann genau im Kontext des gesamten Programms ist nicht genau definiert, wie die Reihenfolge der Initialisierung über übersetzungseinheiten ist nicht genau definiert).Den Vektor selbst ordnet seine Speicher auf dem heap, so wird es keine Einschränkungen bei seiner expansion das wäre anders, wenn Sie instanziiert die Vektor-als lokale Variablen: Sie sind im wesentlichen begrenzt durch den Speicher können Sie zusammenhängend reservieren Sie die Punkte in Zeit, der Vektor muss eine Neuverteilung seinen internen Speicher.
All das sagte, dies ist zwar sicher, dies zu tun, ist es nicht unbedingt guter Praxis; es fällt in die Domäne jeder anderen globalen variable oder Global-zugänglich, wenig Speicher, das kann ein bisschen ein umstrittenes Thema. Generell würde ich raten, dass es besser ist zu vermeiden, Globale Variablen in der Regel. Während es durchaus akzeptabel, in manchen Fällen, die globalen Zugriff im Widerspruch zu Ihrer Fähigkeit zu Steuern, die Zugriff auf die variable, und erzwingen von Invarianten auf Sie und der Staat es kontrolliert oder impliziert. Dies kann dazu führen, schwierig zu verwaltende Systeme als codebase-Skalen, da diese Zugangswege sind nicht eindeutig auszumachen.
InformationsquelleAutor Josh
Dies ist Falsches Verständnis.
Speicher ist nicht zugeordnet zur compile-Zeit. Arbeitsspeicher ist bei dem Programm Start, und dann während das Programm, je nach Lagerung Typen von Variablen. Und wenn Sie das Programm Herunterfahren, alle Speicher verwendet, indem es zurück an das Betriebssystem, egal was.
Nicht. Ein Objekt der
std::vector<int>
kann nie Essen Speicher von einer anderen variable(N).Nun kommen wir zurück zu Ihrer Hauptfrage,
Nicht. Vermeiden Sie Globale Variablen, unabhängig von deren Typ.
InformationsquelleAutor Nawaz
Nur der Speicherplatz für den Vektor-Metadaten zugewiesen werden, die in den Bereich für Globale Variablen. Die Vektor-Inhalte werden immer noch dynamisch zugewiesen werden (Konstruktoren und Destruktoren ausgeführt werden, die normalerweise für Globale Variablen).
Es ist die gleiche situation für eine automatische Vektor-Variablen, wie:
Gibt es ein limit für den Stackspeicher zur Verfügung für automatische Variablen, aber die vector-Inhalte nicht nutzen diesen Raum, nur eine Handvoll Zeiger und Zähler.
Was die stack-Grenzen sind, ist völlig neben der Punkt-Vektor-Inhalte sind nicht zusammenhängend gespeichert mit dem Vektor-Mitglieder, Sie sind gespeichert in einem dynamisch zugewiesenen Bereich. Auch once upon a time stack und heap haben wachsen zueinander. Dann multithreading erfunden habe, und es entstand eine Notwendigkeit für mehrere stacks in einem einzigen Adressraum.
InformationsquelleAutor Ben Voigt
Gut, vec ist eine Globale variable, also der Speicher ist vermutlich zugeordnet, die in der Daten-segment. Jedoch wird der Speicher für die Inhalte von vec hängt von der Zuweisung. Standardmäßig, denke ich, dass der Speicher für den Inhalt ist reserviert auf dem heap.
InformationsquelleAutor istudy0
Globale Variablen sind im Allgemeinen schlechte Praxis. Sie wird nicht "Essen" in den Speicher von anderen Variablen, wie Sie sagen, aber es ist sehr einfach für Sie, wie der Programmierer, um die Schraube etwas nach oben. Zum Beispiel, alles, was im Programm hat Zugang zu diesem Vektor und so alles können zugreifen und ändern Sie es. Sie können oder nicht wollen, aber mehr als wahrscheinlich, das wollen Sie nicht.
Als für die Speicher-Zuordnung, Objekte, die Hinzugefügt werden, um den Vektor sind immer noch auf Laufzeit (weil Sie nicht existieren auf compile-Zeit!). Speicher ist auch nie zugeordnet zur compile-Zeit. Ihr Programm hat Unterschrift Zuordnung dieser Speicher zur Laufzeit. Denke, über, die...wenn das Programm zugewiesenen Speicher zur compile-Zeit, Sie würden nicht wirklich in der Lage sein, um Sie auszuführen, die auf anderen Maschinen würden Sie? Der Speicher zugeordnet werden würde, die auf IHREM Computer, aber nicht auf andere Maschinen. Daher Speicher zugewiesen werden müssen Laufzeit.
Voigt haben Sie jegliche Dokumentation, die auf dieser? Meine Interessen sind in der low-level-Codierung und so, so würde ich mag, darüber zu Lesen, weiter!
Du meinst die definition? Es könnte helfen, zu denken, der den Prozess der hibernation (aka suspend-to-disk). Wenn Sie fortsetzen, einen computer, wird der gesamte Inhalt des Speichers wird Massenkopieren wird kopiert aus einem Bild des Staates, wenn der Ruhezustand eingetreten ist. Sie würde sagen, der memory-Inhalt wird geladen oder kopiert werden, oder so. Aber Sie würde nicht sagen, dass 400 Millionen Zuweisungen stattfinden, während fortsetzen. Der Abschnitt mit globals ist die gleiche Weise, es ist reserviert zur build-Zeit, und dann nur kopiert in den Speicher zur Laufzeit, Beibehaltung der bestehenden Struktur.
Ich sehe, so ist es beiseite legt, wo im Speicher diese Annahmen erscheinen wird und wie viel Speicher Sie verwendet werden, was dann auf run-time-tatsächlich initialisieren der globals.
Recht. Jetzt kommen wir zu dem Unterschied zwischen der globalen Konstanten und Globale Variablen, Globale Konstanten, die (oft als
.cdata
) kopiert werden, von der Festplatte in den Speicher. Für Globale Variablen (oft.data
) der loader nur packt einen ausreichend großen Speicherblock für alle Variablen kombiniert und Nullen, die ganze Sache. In jedem Fall, das layout ist ganz bestimmt zur compile-Zeit. Nach den großen block kopiert wird, dann wird die run-time-Bibliothek starten Konstruktoren für die einzelnen Objekte.InformationsquelleAutor MGZero
Ihr Programm nicht zuordnen, alles, was während der compile-Zeit - ich denke du meinst run-time.
Vektor zuweist, was hält Sie auf dem heap (vec.size() * sizeof(/* was halten Sie*/)) - es gilt sizeof(std::vector<>), auf denen Sie zugeordnet sind. Globale Variablen können überall gespeichert werden, kommt es auf die Umsetzung.
Voigt, soweit ich weiß, Globale Variablen zugewiesen werden, während der Ladezeit, und initialisiert während der Laufzeit.
InformationsquelleAutor Pubby