Dynamisches Array ohne new?



  • int array[length];

    dabei darf length eine stinknormale integer-Variable sein, die zum Beispiel zur Laufzeit eingelesen oder berechnet werden kann.

    MfG Jester



  • Wenn das doch so einfach geht, wieso muckt dann C++ dabei so rum?
    vom generierten Code her sind C und C++ ja sehr ähnlich.



  • TeeJay schrieb:

    Wenn das doch so einfach geht, wieso muckt dann C++ dabei so rum?

    Das genau war meine Frage. Jetzt sind wir schon mal gleichauf. 🙂



  • Weil sowas in C++ nunmal nicht erlaubt ist.



  • Ja das dachte ich mir auch das das nicht erlaubt ist wenn da mein Compiler was dagegen hat *g*

    Mich würde aber gerne interessieren WARUM es nicht erlaubt ist.
    Immerhin ist es ja eine gewisse Einschränkung und da werden die sich wohl was dabei gedacht haben wenn das unter C++ nicht erlaubt ist.

    Ich fänds ganz interessant WARUM es denn also nun nicht mehr erlaubt ist.



  • Hat das eigentlich technische Gründe? Das kann doch dem Stack so &§$%egal sein, wieviel Speicher er jetzt für das Array reservieren muss.

    Ja, hat es.

    In C99 geht das ja. Ich denke aber, dass es auch in C++0x nicht übernommen werden wird, weil es einen Haufen zusätzlicher Schwierigkeiten mit sich bringt, z.B. weil sizeof dann nicht mehr generell zur Compilezeit ausgewertet werden kann.

    Das ist noch das kleinste Problem.

    Wozu schreib ich überhaupt noch was, wenn ich eh ignoriert werde. Nochmal für etwas langsamere: Das ist kein technisches Problem.

    Falsch. Genau das ist es.

    alloca und Arrays variabler Länge existieren (wenn auch nicht in C++). Mit einem Minimalverständnis von Assembler versteht man auch, wie das funktioniert.

    Wir reden über C++, oder? Und da müssen Destruktoren aufgerufen werden, oder? Und woher weiß der Compiler wieviele Destruktoren er für welche Objekte aufrufen soll, wenn das nirgendwo steht?



  • Hier wird als von einem technischem problem geredet...
    Ich bin zwar kein Anfänger, aber ich verstehe den Punkt daran nicht!
    Was soll daran das technische Problem sein? Und warum?



  • TeeJay schrieb:

    Mich würde aber gerne interessieren WARUM es nicht erlaubt ist.
    Immerhin ist es ja eine gewisse Einschränkung und da werden die sich wohl was dabei gedacht haben wenn das unter C++ nicht erlaubt ist.

    Nein, sie habens ja nicht in C++ verboten, sondern in C99 erlaubt. C++ basiert aber auf einem älteren C-Standard (dem von 1989). Und wie ich schon sagte, ist es fraglich, dass das irgendwann übernommen wird, weil man in C++ sehr oft Gebrauch von der Tatsache macht, dass sizeof grundsätzlich eine Compilezeit-Konstante ist, was mit dynamischen Arrays nicht funktionieren würde.



  • Helium schrieb:

    Wir reden über C++, oder? Und da müssen Destruktoren aufgerufen werden, oder? Und woher weiß der Compiler wieviele Destruktoren er für welche Objekte aufrufen soll, wenn das nirgendwo steht?

    Dann steht das halt irgendwo. Glaubst du sizeof ist in C99 über Voodoo definiert?



  • Glaubst du sizeof ist in C99 über Voodoo definiert?

    Moment. Ein sizeof bei einem VLA liefert in C99 die tatsächliche anzahl des gesammten Feldes?



  • Ja, genau.



  • C99 added VLAs. A VLA can be specified by a size that is a variable, but a VLA cannot be resized, and a VLA doesn’t know its size.

    Nachteil laut Stoustrup: "If extended to support C++, destructors must be called for VLA elements, so the size must (conceptually, at least) be stored with a pointer to the elements."

    http://www.cuj.com/documents/s=8191/cuj0209stroustr/



  • Im C99 Standard gibt es sogar explizit ein Beispiel, was sizeof von einem VLA nimmt. Entweder der N869 Draft wurde nochmal extrem umgestellt (was ich nicht glaube) oder Stroustrup ist nicht up to date.



  • Ok, langsam macht das Ganze Sinn. Ich vermisse diese Art dynamischer Arrays sowieso nicht. Aber das Warum hat mich auch mal interressiert.



  • Hallo,
    vorallem können VLAs lediglich automatische Variablen eines Blocks sein. Sie können also insbesondere nicht Member einer Struktur sein. Ein Nachteil der in C++ im Zusammenhang mit der objektorientierten Programmierung sicher noch etwas schwerer wiegt.



  • Das Problem ist nicht, dass es nicht möglich ist (construktors sind wirklich kein Argument schon mal was von einer Schleife gehört?) sondern, dass es einen Grösseren overheat erzeugt als auto_ptr. Ein grösseres teschnisches Problem ist (ich glaub das hat Stoustrup gemeint als er von constructoren gesprochen hat) dass in C++ die Variablen nicht erschaffen werden können wenn der Scope geöffnet wird da sie nicht da definirt werden müssen. Wenn die Gösse at compiletime bekannt ist spielt es keine Rolle in welcher Reienfolge die Arrays auf den Stack kommen jedoch bei Variablen Grössen schon. Um den C/C++ effective zu halten muss man die Addressen der localen Variablen (per ebp offset) hardcoden. Wenn man nun ein array hat mit unbestimmter Größe muss man ein Pointer hardcoden auf den Array. Also das:

    int a;
    int b;
    int c[a];
    int d[b];
    int e;
    

    wird als pseudocode:

    int a;
    int b;
    int*c;
    int*d;
    int e;
    asm {mov dword[_c] esp}
    asm{push a}
    for(int i=0;i<a;i++)
       asm {push 0}
    
    asm {mov dword[_d] esp}
    asm{push b}
    for(int i=0;i<b;i++)
       asm {push 0}
    

    Somit ist die Address von e bekannt. In C++ kann man allerdings die Definitionen nicht so hin und her schieben. Die einzige effective Alternative ist der Heap und das geht mit auto_ptr. Allerdings kann man (und ich würde es begrüssen) auto_ptr in den Syntax einbauen um somit C compatible zu sein.

    Und das mit sizeof in C ist ganz einfach. Oben hab ich ja als allererstes sie Grösse des Arrays auf den Stack gepusht und sizeof liest einfach die Variable aus.

    Ach und der Code oben dient nur als Beispiel (mn könnte noch viel optimiziren) und es ist wie ich es implementiren würd.



  • @Irgendwer:
    In C darf man aber die Variablen auch dort definieren wo man will:

    #include <stdio.h>
    
    int main()
    {
      puts("Hello World\n");
      int i;
      scanf("%d",&i);
      printf("%d\n", i);
      return 0;
    }
    

    ist legales C



  • @irgendwer
    Was willst du eigentlich immer mit den auto_ptrn? auto_ptr und Arrays vertragen sich nicht. Insofern verstehe ich den Zusammenhnag mit dem Thread nicht.

    In C darf man aber die Variablen auch dort definieren wo man will

    Krass. Diese Neuerung von C99 war mir bisher gar nicht bewusst. Endlich mal was, das mir auch gefällt 🙂



  • In C darf man aber die Variablen auch dort definieren wo man will

    Krass. Diese Neuerung von C99 war mir bisher gar nicht bewusst. Endlich mal was, das mir auch gefällt

    Das ist eben C_Shade :p



  • Es wurde nur eines an den Variablendeklarationen geändert und das ist die Deklaration
    in der for-schleife.


Anmelden zum Antworten