Welche technischen Nachteile haben C99-Style-VLAs? [geschlossen]

8

Ich habe von vielen Leuten gehört, dass das Array variabler Länge, das in C99 eingeführt wurde, schrecklich ist. Einige Leute im IRC sagten vor einer Minute: "Ich glaube nicht, dass C ++ VLAs bekommen wird, strousoup hat einige sehr negative Kommentare über sie gemacht".

Was sind die Gründe, warum diese Leute VLAs hassen?

    
qdii 13.09.2012, 13:46
quelle

4 Antworten

6

VLAs weisen Arrays auf dem Stack zur Laufzeit zu, sodass es schwieriger oder sogar unmöglich ist, die zur Kompilierungszeit verwendete Stack-Größe zu bestimmen. Da der Stack eine relativ kleine Menge an verfügbarem Speicher zur Verfügung hat (im Vergleich zum Heap), machen sich viele Sorgen, dass VLAs ein großes Potenzial für einen Stack-Überlauf haben.

Die kommende Version des MISRA-C-Codierungsstandards wird wahrscheinlich auch VLAs verbieten.

    
Lundin 13.09.2012, 14:03
quelle
4

Obwohl Arrays mit variabler Länge ihre Probleme haben, sollte man sich daran erinnern, wie sie entstanden sind: Als Ersatz für alloca() , was wohl even more problematisch .

Während es auf der PDP-11 einfach zu implementieren war, war dies auf anderen Architekturen nicht der Fall, und Ritchie und Thompson entfernten es ihre Umsetzung .

Allerdings war die automatische Zuweisung mit variabler Größe offensichtlich nützlich genug, dass alloca() trotz seiner Probleme wiederbelebt wurde (insbesondere kann es nicht überall dort verwendet werden, wo beliebige Funktionsaufrufe möglich wären, und auf vielen Architekturen muss es ein Compiler sein eingebaut sowieso). Die C-Arbeitsgruppe stimmte der Bereitstellung eines solchen Features zu, hielt aber Arrays mit variabler Länge für die überlegene Lösung.

Wenn Sie sich die Features ansehen, die mit C99 hinzugefügt wurden (komplexe Zahlen, type-generic math, restrict , ...), sollten Sie bemerken, dass viele davon darauf ausgerichtet sind, C zu einer besseren Sprache für numerische Berechnungen zu machen. Variablenlängen-Arrays sind auch dort nützlich und ich glaube, dass Fortran sie bereits zu dieser Zeit hatte. Darüber hinaus führte ihre Einführung auch zu variabel modifizierten abgeleiteten Typen (z. B. Zeigern auf Arrays variabler Größe), die besonders im Umgang mit Matrizen nützlich sind.

    
Christoph 13.09.2012 18:45
quelle
2

VLAs erleichtern das Überlaufen des Stapels erheblich. An den meisten Stellen, an denen Sie ein VLA verwenden würden, würden Sie die Länge auf einem der Funktionsparameter basieren. Wenn der Parameter etwas ist, was Sie nicht erwarten, könnten Sie am Ende ein sehr großes Array auf dem Stack zuweisen. Wenn Sie nicht sicher sein können, dass keine Kombination von Argumenten dazu führen kann, dass Sie den Stack überlaufen lassen, sollten Sie die dynamische Zuweisung verwenden.

An einem Ort könnte es sinnvoll sein, sie auf Embedded-Plattformen zu verwenden, da Embedded-Programmierung eine der wenigen Situationen ist, in denen Sie Ihre Speicherauslastung wahrscheinlich genau verfolgen, um sicher zu gehen, dass Sie sie nicht haben ein Stapelüberlauf.

    
Dirk Holsopple 13.09.2012 13:59
quelle
1

Wie andere bereits erwähnt haben, machen es die VLAs sehr einfach, Ihren Stack Frame zu überfließen. Ich bin kein Compiler-Schreiber, aber mein Verständnis ist, dass VLAs auch ein bugger sein können, um zu unterstützen (sie sind jetzt in C2011 optional). Und ihre Verwendung ist auf Block- oder Funktionsumfang beschränkt; Sie können ein VLA nicht im Dateibereich verwenden, und sie können keine externe Verknüpfung haben.

Ich möchte jedoch nicht, dass die VLA-Syntax verschwindet. Es ist sehr praktisch, wenn dynamisch mehrdimensionalen Arrays zugewiesen wird, bei denen die inneren Dimensionen bis zur Laufzeit nicht bekannt sind, wie zum Beispiel:

%Vor%

Eine zusammenhängende Zuweisung (und eine entsprechende free ), und kann ich als 2D-Array indizieren. Die Alternativen bedeuten in der Regel stückweise Zuordnung:

%Vor%

oder Verwendung von 1-d-Offsets:

%Vor%     
John Bode 13.09.2012 15:24
quelle