Warum erlaubt C ++ Arrays variabler Länge, die nicht dynamisch zugeordnet sind?

7

Ich bin relativ neu in C ++ und von Anfang an wurde mir gezeigt, dass man so etwas nicht machen kann

%Vor%

Stattdessen müssen Sie dynamischen Speicher verwenden. Jedoch habe ich vor kurzem entdeckt, dass das obige wird kompilieren (obwohl ich eine -pedantische Warnung bekomme, dass es von ISO C ++ verboten ist). Ich weiß, dass es offensichtlich eine schlechte Idee ist, es zu tun, wenn es nicht durch den Standard erlaubt ist, aber ich wusste vorher nicht einmal, dass das möglich war.

Meine Frage ist, warum erlaubt g ++ Arrays variabler Länge, die nicht dynamisch zugewiesen werden, wenn es vom Standard nicht erlaubt ist? Wenn es dem Compiler möglich ist, dies zu tun, warum ist es nicht im Standard?

    
Maulrus 09.04.2010, 19:48
quelle

4 Antworten

19

Die Unterstützung für Arrays variabler Länge (VLAs) wurde der C-Sprache in C99 hinzugefügt.

Da die Unterstützung für sie in gcc existiert (um C99 zu unterstützen), war es wahrscheinlich relativ einfach, Unterstützung für g ++ hinzuzufügen.

Allerdings handelt es sich um eine implementierungsspezifische Spracherweiterung, und es ist keine gute Idee, implementierungsspezifische Erweiterungen zu verwenden, wenn Sie möchten, dass Ihr Code portabel ist.

    
James McNellis 09.04.2010, 19:50
quelle
5

Weil es in C99 unterstützt wird. Ich kann nicht wirklich sagen, warum es nicht im C ++ - Standard ist. Es ist jedoch nicht so nützlich, wie Sie vielleicht denken, weil es leicht dazu führt (wenn Sie nicht vorsichtig sind), Stack-Überlauf (da es in der Regel basiert auf alloca , selbst nicht Standard). Ein weiterer Fehler besteht darin, einen Zeiger auf ein dynamisches Array zurückzugeben, das sofort den Gültigkeitsbereich verlässt.

    
Matthew Flaschen 09.04.2010 19:50
quelle
3

Viele Compiler akzeptieren und erweitern Standards. Es gibt zwei grundlegende Gründe:

  1. Nefarious Compiler-Autoren denken wahrscheinlich, dass es die Langlebigkeit erhöht, wenn es schwieriger wird, sich von ihrem Compiler zu entfernen.
  2. Wohltätige Compiler-Autoren denken wahrscheinlich, dass es eine gute Sache ist, Ihnen mehr Optionen zu geben, wenn sie sich selbst zu wenig oder gar nichts kosten können.
MaxGuernseyIII 09.04.2010 19:52
quelle
1

Alle erwähnten Gründe, die damit zu tun haben, dass sie in C sind, sind korrekt, obwohl es Einschränkungen für die Anforderung gibt. Ihr Beispiel zeigt möglicherweise eine flexiblere Unterstützung als in C erforderlich ist (wenn Sie das mit scanf statt mit cin implementiert haben, in eine .c-Datei einfügen und gcc verwenden).

Dies ist fast nur ein impliziter Aufruf von alloca (allocate auto), der nur den Stack-Pointer verringert (die Stack-Größe erhöht) und den neuen Stack-Pointer in ein anderes Register kopiert, das als Zeiger auf den zugewiesenen Speicher verwendet wird. p>

Der Unterschied ist, dass Konstruktoren und Destruktoren nicht für Objekte aufgerufen werden, die mit einer Zuordnung erstellt wurden.

    
nategoose 09.04.2010 20:07
quelle