Gibt es Arrays mit variabler Länge in C++?

Lesezeit: 3 Minuten

Benutzer-Avatar
nikhil_vyas

Ich hatte immer gedacht, dass Arrays mit variabler Länge in c++ nicht erlaubt sind (siehe: Warum sind Arrays mit variabler Länge nicht Teil des C++-Standards?). Aber warum wird dieser Code dann kompiliert und funktioniert?

#include <iostream>
using namespace std;

int main () {

    int n;
    cin >> n;

    int a[n];

    for (int i=0; i<n; i++) {
        a[i] = i;
    }

    for (int i=0; i<n; i++) {
        cout << a[i] << endl;
    }
}

  • Arrays mit variabler Länge werden in C++14 sein

    Benutzer2249683

    25. Februar 2014 um 11:56 Uhr

  • Sie werden von C99 und GCC >= 4.7 (und Clang auch AFAIK) spezifiziert und bieten es auch als Erweiterung für C++ an.

    – Stefano Sanfilippo

    25. Februar 2014 um 11:57 Uhr

  • VLAs haben es nicht in C++14 geschafft

    – MM

    3. November 2014 um 6:55 Uhr

  • warum wird da keiner erwähnt vector?!

    – Marson Mao

    3. November 2014 um 7:40 Uhr

  • @MarsonMao-Arrays mit variabler Länge würden, falls implementiert, Speicher im Stapel zuweisen, während Vektor Speicher im Heap zuweisen würde.

    – nikhil_vyas

    4. November 2014 um 19:21 Uhr

Benutzer-Avatar
David Heffernan

Der aktuelle C++-Standard verlangt nicht, dass Compiler VLAs unterstützen. Compiler-Anbieter dürfen jedoch VLAs als Erweiterung unterstützen. GCC >= 4.7 beispielsweise schon.

Ursprünglich wurde vorgeschlagen, dass VLAs in C++14 erscheinen würden, der Vorschlag war jedoch nicht erfolgreich. Sie tauchten letztendlich auch nicht in C++17 auf.

  • Werden sie wirklich unterstützt? Sie wurden ausgiebig diskutiert und eine Reihe von Problemen wurden angesprochen, deren Lösung nicht trivial schien (das berüchtigtste war array.~dynarray(); new (&array) dynarray{..};).

    – Matthias M.

    25. Februar 2014 um 12:18 Uhr

  • @MatthieuM. Arrays in Laufzeitgröße sind Teil von C++14. Sie sind nicht genau dasselbe wie C-VLAs. Der Code in der Frage funktioniert in C99 genauso wie in C++14. Nun, modulo die Verwendung von cout und so weiter. Der Array-Teil davon ist das, worauf ich mich konzentriere.

    – David Heffernan

    25. Februar 2014 um 12:22 Uhr


  • Mein Verständnis war, dass der Status von dynarray war in der Schwebe.

    – Matthias M.

    25. Februar 2014 um 13:04 Uhr

  • @Matthieu Ich spreche nicht von Dynarray

    – David Heffernan

    25. Februar 2014 um 13:08 Uhr

  • Ja, der Vorschlag für VLAs in C++ ist ein Witz, und ein schlechter noch dazu: Er lässt praktisch nur 1D-VLAs auf dem Stack zu. Es bietet keine Unterstützung für Zeiger auf Arrays variabler Länge, wie es C99 tut, und erlaubt daher nicht, ein 2D-VLA zuzuweisen und es an eine Funktion weiterzugeben, um die Daten zu bearbeiten.

    – Cmaster – Wiedereinsetzung von Monica

    5. April 2018 um 13:16 Uhr

Benutzer-Avatar
con ko

C99 erlaubt VLA, aber C++ erlaubt das nie, weil die Leistung von VLA so unfreundlich ist. Und in C11 wird VLA zu einer optionalen Funktion.

Zuvor hieß es, dass VLA bei C++17 erscheinen würde. Aber jetzt wird C++17 veröffentlicht und auch kein VLA. (Und es scheint, dass C++20 kein VLA haben wird. Die jüngsten Dokumente haben überhaupt nicht darüber gesprochen.)

Obwohl der Standard es nicht unterstützt, unterstützt der GNU-Compiler es als Verlängerung.

  • “C++ lässt das nie zu, weil die Leistung von VLA so unfreundlich ist.” Sie haben also einen Link zu den offiziellen Diskussionen, in denen die Leistung als Grund gegen die Aufnahme von VLAs in C++ angeführt wurde?

    – Unterstrich_d

    5. April 2018 um 12:57 Uhr

  • C++20 wird noch einige Jahre nicht veröffentlicht. Vielleicht meinen Sie, dass dem Ausschuss vorläufige Entwürfe vorgelegt werden?

    – Stephen M. Webb

    5. April 2018 um 13:08 Uhr

  • @StephenM.Webb Ja, vielleicht habe ich das falsche Wort verwendet, ich werde es bearbeiten, danke.

    – con ko

    5. April 2018 um 13:10 Uhr

  • @underscore_d Also, was denkst du darüber, warum C11 es zu einer optionalen Funktion macht und warum C++ es nicht unterstützt? Vielen Dank für Ihren Kommentar.

    – con ko

    5. April 2018 um 13:15 Uhr

  • Versuchen Sie nicht, das auf mich zu verpfänden! Sie sind derjenige, der die Antwort geschrieben hat, also sollten Sie zitieren dein Quellen. Ich meine, Sie erwähnen in Ihrer Antwort sogar “aktuelle Dokumente”, können aber irgendwie auf keines davon verlinken.

    – Unterstrich_d

    5. April 2018 um 13:17 Uhr

1013210cookie-checkGibt es Arrays mit variabler Länge in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy