it-swarm.com.de

Statisches Array vs. dynamisches Array in C++

Was ist der Unterschied zwischen einem statischen Array und einem dynamischen Array in C++?

Ich muss eine Zuordnung für meine Klasse vornehmen und es heißt, keine statischen Arrays zu verwenden, sondern nur dynamische Arrays. Ich habe im Buch und online nachgesehen, aber ich verstehe das nicht. 

Ich dachte statisch wurde zur Kompilierzeit erstellt und dynamisch zur Laufzeit, aber ich könnte dies mit der Speicherzuordnung verwechseln. 

Können Sie den Unterschied zwischen statischem Array und dynamischem Array in C++ erklären?

72
user69514

Lokale Arrays werden auf dem Stack erstellt und verfügen über eine automatische Speicherdauer. Sie müssen den Speicher nicht manuell verwalten, werden jedoch zerstört, wenn die Funktion, in der sie arbeiten, endet. Sie haben notwendigerweise eine feste Größe:

int foo[10];

Mit operator new[] erstellte Arrays haben eine dynamische Speicherdauer und werden auf dem Heap gespeichert (technisch gesehen der "Free Store"). Sie können eine beliebige Größe haben, aber Sie müssen sie selbst zuweisen und freigeben, da sie nicht Teil des Stack-Frames sind:

int* foo = new int[10];
delete[] foo;
82
Michael Mrozek

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 sie drei verschiedene Bedeutungen in unterschiedlichen Kontexten. Aus diesem Grund kann ein statisches Array entweder fest oder dynamisch sein.

Lassen Sie mich erklären:

Der erste ist C++ - spezifisch:

  • Ein statischer Klassenmitglied ist ein Wert, der nicht mit dem Konstruktor instanziiert oder mit dem Destruktor gelöscht wird. Dies bedeutet, dass das Member auf andere Weise initialisiert und gepflegt werden muss. Ein statischer Member kann Zeiger sein, die auf null initialisiert werden und dann zugewiesen werden, wenn ein Konstruktor zum ersten Mal aufgerufen wird. (Ja, das wäre statisch und dynamisch) 

Zwei werden von C geerbt:

  • innerhalb einer Funktion ist eine statische Variable eine Variable, deren Speicherort zwischen Funktionsaufrufen beibehalten wird. 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, d. H. Nicht fadensicher).

  • außerhalb von Funktionen deklarierte statische Variablen sind globale Variablen, auf die nur innerhalb desselben Moduls zugegriffen werden kann (Quellcodedatei mit anderen # include's).

Die Frage (ich denke), die Sie fragen wollten, ist der Unterschied zwischen dynamischen Arrays und festen Arrays oder Compile-Arrays. Dies ist eine einfachere Frage, da Arrays zur Kompilierzeit vorab festgelegt werden (wenn das Programm kompiliert wird) und Teil eines Funktionsstack-Frames sind. Sie werden zugewiesen, bevor die Hauptfunktion ausgeführt wird. Dynamische Arrays werden zur Laufzeit mit dem Schlüsselwort "new" (oder der Malloc-Familie von C) zugewiesen, und ihre Größe ist im Voraus nicht bekannt. Dynamische Zuordnungen werden nicht automatisch bereinigt, bis das Programm nicht mehr läuft.

25
Joshua Clayton

Ich denke, die Semantik, die in Ihrem Unterricht verwendet wird, ist verwirrend. Was wahrscheinlich mit "statisch" gemeint ist, ist einfach "konstante Größe". In diesem Fall könnte ein Array mit konstanter Größe folgendermaßen aussehen:

int x[10];

eine "dynamische" Struktur wäre einfach jede Art von Struktur, die die Erhöhung oder Verringerung des zugrunde liegenden Speichers zur Laufzeit ermöglicht. Meistens reicht die Klasse std::vector aus der C++ - Standardbibliothek aus. Verwenden Sie es so:

std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.

std::vector hat operator[] definiert, sodass Sie es mit derselben Semantik wie ein Array verwenden können.

11
Ben Collins

Es ist wichtig, klare Definitionen für die Begriffe zu haben. Leider scheint es mehrere Definitionen zu geben, was statische und dynamische Arrays bedeuten.

Statische Variablen sind Variablen, die mit statische Speicherzuweisung definiert werden. Dies ist ein allgemeines Konzept, unabhängig von C/C++. In C/C++ können statische Variablen mit globalem, Datei- oder lokalem Gültigkeitsbereich wie folgt erstellt werden:

int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
    static int z[10]; //static array with local scope

Automatische Variablen werden normalerweise mit stapelbasierter Speicherzuordnung implementiert. Ein automatisches Array kann wie folgt in C/C++ erstellt werden:

foo() {
    int w[10]; //automatic array

Diese Arrays, x, y, z und w, haben gemeinsam, dass die Größe jedes Arrays festgelegt ist und zur Kompilierzeit definiert wird.

Der Unterschied zwischen einem automatischen und einem statischen Array ist unter anderem deshalb wichtig, weil statische Speicherung normalerweise in Datenabschnitt (oder BSS-Abschnitt ) eines Objekts implementiert ist file und der Compiler können absolute address verwenden, um auf die Arrays zuzugreifen, was bei stapelbasierter Speicherung nicht möglich ist.

Was normalerweise mit einem dynamischen Array gemeint ist, ist nicht einer, dessen Größe verändert werden kann, sondern mit dynamischer Speicherzuordnung mit einer zur Laufzeit bestimmten festen Größe implementiert. In C++ erfolgt dies mit dem Operator new .

foo() {
   int *d = new int[n]; //dynamically allocated array with size n     

Es ist jedoch möglich, ein automatisches Array mit einer fixierten Größe zu erstellen, die zur Laufzeit mit alloca definiert wird:

foo() {
    int *s = (int*)alloca(n*sizeof(int))

Für ein echtes dynamisches Array sollte etwas wie std::vector in C++ (oder ein Array mit variabler Länge in C verwendet werden.

Was war für den Auftrag in der Frage des OP gemeint? Ich denke, es ist klar, dass das, was gewünscht wurde, kein statisches oder automatisches Array war, sondern eines, das entweder die dynamische Speicherzuweisung unter Verwendung des new-Operators oder ein Array nicht fester Größe unter Verwendung von z. std::vector.

8
Z boson

Statische Arrays werden zur Kompilierzeit Speicher zugewiesen, und der Speicher wird auf dem Stack zugewiesen. Den dynamischen Arrays wird jedoch zur Laufzeit Speicher zugewiesen, und der Speicher wird aus dem Heap zugewiesen. 

int arr[] = { 1, 3, 4 }; // static integer array.   
int* arr = new int[3]; // dynamic integer array.
8
Jagannath

Ich denke in diesem Zusammenhang bedeutet es statisch in dem Sinne, dass die Größe fest ist. Es hat eine resize () - Funktion.

3
Eddy Pronk

Sie könnten über ein pseudo-dynamisches Array verfügen, in dem die Größe zur Laufzeit vom Benutzer festgelegt wird, danach aber behoben wird.

int size;
cin >> size;
int dynamicArray[size];
1
Joshua Oliphant

Ja, das statische Array wird zur Kompilierungszeit erstellt, während das dynamische Array zur Laufzeit erstellt wird. Wo sich der Unterschied hinsichtlich ihrer Speicherorte befindet, befinden sich die statischen Daten auf dem Stapel und die dynamischen auf dem Heap. Alles, was sich auf einem Heap befindet, benötigt die Speicherverwaltung, und sofern kein Garbage Collector wie im .net Framework vorhanden ist, besteht ansonsten die Gefahr eines Speicherverlusts.

0
Aadil Imran

Statisches Array: Effizienz. Es ist keine dynamische Zuweisung oder Freigabe erforderlich. 

Arrays, die in C, C++ in der Funktion deklariert sind, einschließlich des statischen Modifizierers, sind statisch. Beispiel: static int foo [5];

0
Khuê Phạm