2014-04-08 12 views

risposta

14

La dichiarazione globale della matrice fa sì che il compilatore includa lo spazio per l'array nella sezione dati del file binario compilato. In questo caso è stata aumentata la dimensione binaria di 8 MB (2000000 * 4 byte per int). Tuttavia, ciò significa che la memoria è sempre disponibile e non deve essere allocata nello stack o nell'heap.

EDIT: @Blue Luna osserva giustamente che un non inizializzata serie molto probabilmente sarà assegnata nel segmento di dati bss e può, infatti, occupano ulteriore spazio su disco. L'array inizializzato verrà assegnato in modo statico.

Quando si dichiara un array di grandi dimensioni nel proprio programma, è probabile che sia stata superata la dimensione dello stack del programma (provocando ironicamente uno stack overflow).

Un modo migliore per allocare una vasta gamma dinamica è quello di utilizzare un puntatore e allocare la memoria sul mucchio simili:

using namespace std; 
int main() { 
    int *ar; 
    ar = malloc(2000000 * sizeof(int)); 

    if (ar != null) { 
    // Do something 
    free(ar); 
    } 

    return 0; 
} 

Un buon tutorial sul Memory Layout of C Programs can be found here.

+0

Inoltre, non dimenticare di controllare che malloc è riuscito – dkrikun

+1

In Visual Studio, probabilmente si potrebbe usare questo per aumentare la dimensione massima dello stack: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx – dkrikun

+0

Mentre il tutto - dove va cosa - su globali e oggetti con durata statica esplicita è un dettaglio di implementazione, in genere le variabili non inizializzate vanno nella sezione .bss e non gonfiano le dimensioni binarie. E [usando namespace std; è disapprovato in C++] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice). –

Problemi correlati