Wenn das Array global deklariert wird, fügt der Compiler den Platz für das Array in den Datenabschnitt der kompilierten Binärdatei ein. In diesem Fall haben Sie die Binärgröße um 8 MB (2000000 * 4 Bytes pro Int) erhöht. Dies bedeutet jedoch, dass der Speicher jederzeit verfügbar ist und nicht auf dem Stack oder Heap zugewiesen werden muss.
EDIT: @Blue Mond Recht ausführt, dass ein nicht initialisierter Array wird höchstwahrscheinlich in der bss
Datensegment zugeordnet werden und kann in der Tat keine zusätzlichen Speicherplatz einnehmen. Ein initialisiertes Array wird statisch zugewiesen.
Wenn Sie ein Array so groß in Ihrem Programm deklarieren, haben Sie wahrscheinlich die Stack-Größe des Programms überschritten (und ironischerweise verursacht stack overflow).
Eine bessere Möglichkeit, ein großes Array dynamisch zuzuweisen ist, um einen Zeiger zu verwenden, und den Speicher auf der Halde wie diese zuzuteilen:
using namespace std;
int main() {
int *ar;
ar = malloc(2000000 * sizeof(int));
if (ar != null) {
// Do something
free(ar);
}
return 0;
}
Ein gutes Tutorial auf den Memory Layout of C Programs can be found here.
Vergessen Sie auch nicht zu überprüfen, dass malloc erfolgreich war – dkrikun
In Visual Studio könnten Sie wahrscheinlich verwenden, um die maximale Stackgröße zu erhöhen: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx – dkrikun
Während das Ganze - wo geht was - über Globals und Objekte mit expliziter statischer Dauer ein Implementierungsdetail ist, gehen typischerweise nicht initialisierte Variablen in den .bss-Bereich und blasen keine Binärgröße auf. Und [mit Namespace std; ist in C++ verpönt] (http://stackoverflow.com/questions/1452721/why-isusing-namespace-std-considered-bad-practice). –