Was ist der Unterschied zwischen einem statischen Array und einem dynamischen Array in C ++?
Ich muss eine Aufgabe für meine Klasse machen und es heißt, keine statischen Arrays zu verwenden, sondern nur dynamische Arrays. Ich habe im Buch und online nachgesehen, aber ich scheine es nicht zu verstehen.
Ich dachte, dass statisch zur Kompilierungszeit und dynamisch zur Laufzeit erstellt wurde, aber ich könnte dies mit der Speicherzuweisung verwechseln.
Können Sie den Unterschied zwischen statischem und dynamischem Array in C ++ erklären?
Antworten:
Lokale Arrays werden auf dem Stapel erstellt und haben eine automatische Speicherdauer. Sie müssen den Speicher nicht manuell verwalten, sie werden jedoch zerstört, wenn die Funktion, in der sie sich befinden, beendet wird. Sie haben notwendigerweise eine feste Größe:
Mit erstellte Arrays
operator new[]
haben eine dynamische Speicherdauer und werden auf dem Heap gespeichert (technisch gesehen der "freie Speicher"). Sie können jede Größe haben, aber Sie müssen sie selbst zuweisen und freigeben, da sie nicht Teil des Stapelrahmens sind:quelle
int* foo = new int[N]
Sie sie für sichdelete
selbst haben und daher bei Ausnahmen vorsichtig sein müssen. Statische Arrays haben diese Probleme nicht.static ist ein Schlüsselwort in C und C ++. Daher hat static anstelle eines allgemeinen beschreibenden Begriffs eine sehr spezifische Bedeutung, wenn es auf eine Variable oder ein Array angewendet wird. Um die Verwirrung zu verstärken, hat es drei verschiedene Bedeutungen in getrennten Kontexten. Aus diesem Grund kann ein statisches Array entweder fest oder dynamisch sein.
Lassen Sie mich erklären:
Das erste ist C ++ spezifisch:
Zwei werden von C geerbt:
Innerhalb einer Funktion ist eine statische Variable eine Variable, deren Speicherort zwischen Funktionsaufrufen erhalten bleibt. Es ist insofern statisch, als es nur einmal initialisiert wird und seinen Wert zwischen Funktionsaufrufen beibehält (die Verwendung von Statik macht eine Funktion nicht wiedereintrittsfähig, dh nicht threadsicher).
Außerhalb von Funktionen deklarierte statische Variablen sind globale Variablen, auf die nur innerhalb desselben Moduls zugegriffen werden kann (Quellcodedatei mit anderen # Includes).
Die Frage (glaube ich), die Sie stellen wollten, ist, was der Unterschied zwischen dynamischen Arrays und Arrays mit fester oder Kompilierungszeit ist. Dies ist eine einfachere Frage. Arrays zur Kompilierungszeit werden im Voraus festgelegt (wenn das Programm kompiliert wird) und sind Teil eines Funktionsstapelrahmens. Sie werden zugewiesen, bevor die Hauptfunktion ausgeführt wird. Dynamische Arrays werden zur Laufzeit mit dem Schlüsselwort "new" (oder der Malloc-Familie aus C) zugewiesen, und ihre Größe ist nicht im Voraus bekannt. Dynamische Zuordnungen werden nicht automatisch bereinigt, bis das Programm nicht mehr ausgeführt wird.
quelle
new[]
Operator deklarieren , wie kommt es dann, dass die Größe erst zur Laufzeit bekannt ist? dhint* p = new int[10]
Ich denke, die Semantik, die in Ihrer Klasse verwendet wird, ist verwirrend. Was wahrscheinlich mit "statisch" gemeint ist, ist einfach "konstante Größe", und was wahrscheinlich mit "dynamisch" gemeint ist, ist "variable Größe". In diesem Fall könnte ein Array mit konstanter Größe folgendermaßen aussehen:
und eine "dynamische" wäre einfach jede Art von Struktur, die es ermöglicht, den zugrunde liegenden Speicher zur Laufzeit zu vergrößern oder zu verkleinern. Meistens reicht die
std::vector
Klasse aus der C ++ - Standardbibliothek aus. Verwenden Sie es so:std::vector
hatoperator[]
definiert, so dass Sie es mit der gleichen Semantik wie ein Array verwenden können.quelle
new int[10]
Statischen Arrays wird zur Kompilierungszeit Speicher zugewiesen, und der Speicher wird auf dem Stapel zugewiesen. Während den dynamischen Arrays zur Laufzeit Speicher zugewiesen wird und der Speicher vom Heap zugewiesen wird.
quelle
Es ist wichtig, klare Definitionen der Begriffe zu haben. Leider scheint es mehrere Definitionen dafür zu geben, was statische und dynamische Arrays bedeuten.
Statische Variablen sind Variablen, die mithilfe der statischen Speicherzuordnung definiert werden . Dies ist ein allgemeines Konzept, das von C / C ++ unabhängig ist. In C / C ++ können wir statische Variablen mit globalem, Datei- oder lokalem Bereich wie folgt erstellen:
Automatische Variablen werden normalerweise mithilfe einer stapelbasierten Speicherzuordnung implementiert . Ein automatisches Array kann in C / C ++ folgendermaßen erstellt werden:
Was diese Arrays
x, y, z
, undw
gemeinsam haben , ist , dass die Größe für jeden von ihnen befestigt ist und während der Kompilierung definiert.Einer der Gründe, warum es wichtig ist, die Unterscheidung zwischen einem automatischen Array und einem statischen Array zu verstehen, besteht darin, dass statischer Speicher normalerweise im Datenabschnitt (oder BSS-Abschnitt ) einer Objektdatei implementiert ist und der Compiler absolute Adressen verwenden kann, um auf die Arrays zuzugreifen Dies ist mit stapelbasiertem Speicher nicht möglich.
Was normalerweise mit einem dynamischen Array gemeint ist, ist nicht eines, dessen Größe geändert werden kann, sondern eines, das mithilfe einer dynamischen Speicherzuordnung mit einer zur Laufzeit festgelegten festen Größe implementiert wird. In C ++ erfolgt dies mit dem
new
Operator .Es ist jedoch möglich, ein automatisches Array mit einer zur Laufzeit definierten Fixgröße zu erstellen, indem
alloca
:Für ein echtes dynamisches Array sollte man so etwas wie
std::vector
in C ++ verwenden (oder ein Array mit variabler Länge in C ).Was war für die Aufgabe in der Frage des OP gedacht? Ich denke, es ist klar, dass nicht ein statisches oder automatisches Array gewünscht wurde, sondern eines, das entweder die dynamische Speicherzuweisung mit dem
new
Operator oder ein Array mit nicht fester Größe unter Verwendung von zstd::vector
.quelle
Ich denke in diesem Zusammenhang bedeutet dies, dass es in dem Sinne statisch ist, dass die Größe fest ist. Verwenden Sie std :: vector. Es hat eine resize () Funktion.
quelle
Sie könnten ein pseudo-dynamisches Array haben, bei dem die Größe vom Benutzer zur Laufzeit festgelegt wird, danach jedoch festgelegt wird.
quelle
Ja, richtig, das statische Array wird zur Kompilierungszeit erstellt, während das dynamische Array zur Laufzeit erstellt wird. Wenn der Unterschied in Bezug auf ihre Speicherorte besteht, befinden sich die statischen Daten auf dem Stapel und die dynamischen werden auf dem Heap erstellt. Alles, was sich auf dem Heap befindet, benötigt die Speicherverwaltung, bis ein Garbage Collector wie im Fall des .net-Frameworks vorhanden ist, da sonst die Gefahr eines Speicherverlusts besteht.
quelle
Statisches Array: Effizienz. Es ist keine dynamische Zuordnung oder Freigabe erforderlich.
In C, C ++ deklarierte Arrays mit statischem Modifikator sind statisch. Beispiel: static int foo [5];
quelle
statische arrary meens mit dem Angeben von Elementen in der Seite des Arrays
Dynamische Arrary-Meens, ohne Elemente in der Seite des Arrays anzugeben
Beispiel:
quelle