Dynamisches Array ohne new?
-
Weil bei der Initialisierung eines Arrays in [] nur Konstanten erlaubt sind.
-
Hat das eigentlich technische Gründe? Das kann doch dem Stack so &§$%egal sein, wieviel Speicher er jetzt für das Array reservieren muss.
-
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.
Und dann wär da noch alloca. Sowas wie malloc, nur dass der Speicher vom Stack genommen wird, und demzufolge Scope-Austritt automatisch freigegeben wird.
-
Ein array das mit
int i[10]
erstellt wird eine lokale Variable ist die auf dem Stack gespeichert wird.
Und beim compilen muß bekannt sein wie groß dieses Array ist, damit der Stack dementsprechend eingerichtet werden kann.Auch hier kann ich nur empfehlen sich mal etwas eingehender mit Rechnerarchitektur und Assembler auseinanderzusetzen.
In ASM muß niemand wirklich Programme schrieben können, aber eine gute Lektüre sollte auch einem C++ Programmiere einige gute Kenntnisse darüber geben was hinter seinem Code abläuft.
-
Hat das eigentlich technische Gründe? Das kann doch dem Stack so &§$%egal sein, wieviel Speicher er jetzt für das Array reservieren muss.
Weil der stack nicht dafür gedacht ist. Wenn man eine lokale Variable benutzt baut der compiler ja eine address (keine absolute sondern relative zu ebp oder manchmal auch esp) in den code ein. Fals nun diese address unbekannt at compile time ist, weil die Grösse einer Variablen (des Arrays) unbekannt ist, so wird das ganze will kompilzirter und produzirt einen nicht zu unterschätzenden overheat.
In C++ gibt es auto_ptr dafür.
-
@Tee, zufälligerweise bin gerade dabei, mich damit auseinander zu setzen. Und ich verstehe immer noch das Problem nicht.
Das Array wird zur Laufzeit angelegt und bei nem int-Array (als Beispiel) ist es doch jetzt wurscht, ob der Stackzeiger jetzt 5*sizeof(int) oder 9834*sizeof(int) nach oben springen muss. Das kann zur Laufzeit wunderbar berechnet werden und in asm lässt sich das ebenfalls hervorragend implementieren. Mir ist schleierhaft, warum das der Compiler zur Compilierzeit genau wissen will, auch wenn es mich nicht stört, ich habe so etwas noch nie gebraucht.
-
Wozu schreib ich überhaupt noch was, wenn ich eh ignoriert werde. Nochmal für etwas langsamere: Das ist kein technisches Problem. alloca und Arrays variabler Länge existieren (wenn auch nicht in C++). Mit einem Minimalverständnis von Assembler versteht man auch, wie das funktioniert.
-
Ja ich weiß man könnte das mit ASM bequem lösen.
Jedoch ist es halt von C/C++ so vorgegeben, das lokale Variablen nur mit zur Compilezeit bekannter Größe erstellt werden kann.
Zum einen hat es den evtl. Vorteil das der Compiler schon erkennen kann das ein Stacküberlauf passieren wird.
Schonmal versucht ein lokales Array mit 5MB anzulegen? *G*
-
TeeJay schrieb:
Jedoch ist es halt von C/C++ so vorgegeben, das lokale Variablen nur mit zur Compilezeit bekannter Größe erstellt werden kann.
Hallo? Hast du Bashars Posting gelesen?
In C gibt es solche Arrays!
-
TeeJay schrieb:
Jedoch ist es halt von C/C++ so vorgegeben, das lokale Variablen nur mit zur Compilezeit bekannter Größe erstellt werden kann.
Es ist von C++ vorgegeben. C beherrscht seit 1999 variable-length-arrays.
Schonmal versucht ein lokales Array mit 5MB anzulegen? *G*
Ja, was soll dann passieren? Haut meine Maschine nicht aus den Socken, vielleicht ist das unter Windows ein Problem, weiß ich nicht.
-
Wenn C das beherrscht, dann poste doch einfach wie es genau geht und dann ist ja gut.
-
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?