Was ist der Unterschied zwischen alloca (n) und char x [n]?

7

Was ist der Unterschied zwischen

? %Vor%

und

%Vor%

... wobei size eine Variable ist, deren Wert zur Kompilierzeit unbekannt ist.

    
Jared Pochtar 10.04.2010, 19:02
quelle

6 Antworten

13

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.

    
Billy ONeal 10.04.2010, 19:05
quelle
6

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.

    
rjh 10.04.2010 19:09
quelle
5

Abgesehen von dem Punkt, den Billy erwähnt hat, ist alloca nicht standardgemäß (nicht einmal in C99).

    
Matthew Flaschen 10.04.2010 19:10
quelle
0

In der zweiten Form muss size eine Konstante sein, von der bekannt ist, dass sie Zeit kompiliert.

    
Vlad 10.04.2010 19:05
quelle
0

Neben den bereits besprochenen Punkten, wann genau der Raum frei wird und ob das Konstrukt überhaupt unterstützt wird, gibt es auch das:

  • Im Fall alloca hat bytes einen Zeigertyp.
  • Im Fall [] 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.)

    
Kevin Reid 10.04.2010 19:26
quelle
0

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.

    
nategoose 12.04.2010 17:07
quelle