6

Vor kurzem fand ich ein interessantes Verhalten von g ++, wenn sie mit MSVC Vergleich ++ 2008 dieses kleine Programm vor:Unterschiedliches Verhalten von Compilern mit Array-Zuweisung

#include <cstdlib> 

const int ARR_LENGTH = 512; 

void doSomething(int iLen); 

int main(int argc, char** argv) 
{ 
    doSomething(ARR_LENGTH); 
    return 0; 
} 

void doSomething(int iLen) 
{ 
    int iTest[iLen]; 
    return; 
} 

Wird es kompilieren? Was denken Sie? Nach meiner Kenntnis von C (oder C++ für diese Angelegenheit), sollte dies nicht kompilieren, da ich die Funktion doSomething() mit jeder beliebigen Zahl aufrufen kann, so dass die Größe des iTest-Array nicht zur Kompilierzeit bestimmt werden kann. Allerdings, wenn ich versuche, dies mit g ++ zu kompilieren, funktioniert es gut. Jetzt kann ich verstehen, was wahrscheinlich hier passiert ist - der Compiler hat bemerkt, dass ich diese Funktion nur einmal aufrufen muss, indem ich eine Kompilierzeitkonstante als Parameter übergebe. Einige ernsthaften Optimierungen gehen hier ... Aber wenn ich versuche, dies mit MSVC++ 2008 zu kompilieren, bekomme ich diese:

1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression 
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0 
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size 

Meine Frage ist:, wie dies mit der Definition der Sprache nicht entspricht (die C Standard (C++ Standard))? Ist es für g ++ in Ordnung, eine solche Optimierung zu machen (die in diesem Fall leicht zu sehen ist, aber das erste Mal, als ich darauf gestoßen bin, war es in einem großen Projekt und es machte auf den ersten Blick keinen Sinn).

+0

mögliche Duplikate von [Arrays mit variabler Länge in C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –

Antwort

5

C99 (die neueste Version des C-Standards) erlaubt Arrays mit dynamischer Größe. Die Funktion wird jedoch nicht von Visual Studio unterstützt (das nur C89-Unterstützung implementiert)

In C++ ist es nicht, und wird wahrscheinlich nie gültig sein.

+0

Warum wird es in C++ niemals gültig sein? Der Compiler muss nur den Stack-Pointer anpassen, alles mit dem Standardkonstruktor initialisieren und sicherstellen, dass es beim Scope-Exit bereinigt wird, richtig? Nicht einfach, aber auch nicht unmöglich. Es schlägt sicher mit 'alloca()'. –

+0

JALF sagte "wahrscheinlich wird nie gültig sein", und ein guter Grund zu denken, dass das C++ Komitee gerade den Standard für die nächste Version von C++ geschrieben hat, berücksichtigten sie definitiv alle Funktionen, die C in C99 hinzugefügt und VLAs weren Ich akzeptiere nicht. Siehe auch http://StackOverflow.com/Questions/1887097/Variable-Length-Arrays-in-C –

+1

Wie @Ben sagte, wurde es für die kommende C++ 0x abgelehnt, also müssten sie diese Entscheidung in umgekehrter Reihenfolge um es später hinzuzufügen. In C++ ist es einfach nicht so notwendig wie in C. C++ hat bereits 'std :: vector', was viele der gleichen Probleme löst. In C++ brauchen wir weniger VLAs. – jalf

2

Dynamisch große Arrays sind ein Merkmal von C99. Wenn Ihr Compiler C99 unterstützt (GCC tut, VC ist nicht vollständig) - und wenn Sie den Schalter C99 - werfen, dann wird dies kompiliert.

0

Dies ist nicht Standard C++ (aber Standard C). Implementierungen können alloca (oder _alloca mit msvc) bereitstellen, was die Aufgabe ziemlich gut erfüllt.

Verwandte Themen