Was ist der Unterschied zwischen
? %Vor%und
%Vor%... wobei size eine Variable ist, deren Wert zur Kompilierzeit unbekannt ist.
alloca()
gibt den Speicher nicht zurück, bis die aktuelle Funktion endet, während das Array variabler Länge den Speicher zurückfordert, wenn der aktuelle Block endet.
Anders ausgedrückt:
%Vor% alloca()
kann (in gewisser Weise) auf jedem C89-Compiler unterstützt werden, während das Array variabler Länge einen C99-Compiler benötigt.
Aus der GNU-Dokumentation :
Der mit alloca zugewiesene Speicherplatz ist vorhanden, bis die enthaltende -Funktion zurückgegeben wird. Der Speicherplatz für ein Array mit variabler Länge wird freigegeben, sobald der Scope des Array-Namens endet. (Wenn Sie sowohl Arrays mit variabler Länge als auch alloca in derselben Funktion verwenden, wird die Freigabe eines Arrays mit variabler Länge auch die Zuordnung von Objekten entfernen, die erst kürzlich mit alloca zugewiesen wurden.)
Außerdem ist alloca
keine Standard-C-Funktion, daher kann die Unterstützung nicht für alle Compiler garantiert werden. Arrays mit variabler Länge sind Teil des C99-Standards, daher sollte jeder C99-unterstützende Compiler es implementieren.
Abgesehen von dem Punkt, den Billy erwähnt hat, ist alloca
nicht standardgemäß (nicht einmal in C99).
Neben den bereits besprochenen Punkten, wann genau der Raum frei wird und ob das Konstrukt überhaupt unterstützt wird, gibt es auch das:
alloca
hat bytes
einen Zeigertyp. []
hat bytes
einen Array-Typ. Der auffälligste Unterschied ist, in welcher sizeof(bytes)
ist; für einen Zeiger ist es die Größe des Zeigers ( sizeof(void *)
), während für ein Array die Größe des zugewiesenen Raums ist ( sizeof(char) * size
, was = size
für diesen Fall, da sizeof(char)
= 1).
(Auch in Ihrem Beispiel sind die Elementtypen unterschiedlich; um gleich zu sein, sollte der erste in char *bytes = alloca(size)
geändert werden.)
Der größte Unterschied besteht darin, dass alloca keine Konstruktoren oder Destruktoren aufruft, wenn Sie den Speicher als Klassenvariablen verwenden.
Die anderen Unterschiede werden weniger wahrscheinlich bemerkt, aber können in einigen seltsamen Laufzeitfehlern in einigen Situationen offensichtlich werden.
Tags und Links c objective-c objective-c++ alloca