2012-03-31 17 views
8

Sono curioso di sapere se è possibile determinare la dimensione massima che un array può avere in C++.Trova la dimensione massima di array statici in C++

#include <iostream> 

    using namespace std; 

    #define MAX 2000000 

    int main() 
    { 
     long array[MAX]; 
     cout << "Message" << endl; 
     return 0; 
    } 

Questo compila bene, ma poi segfaults non appena l'eseguo (anche se matrice non è in realtà riferimento). So che è anche la dimensione dell'array perché se lo cambio a 1000000 funziona bene.

Quindi, c'è qualche definizione in qualche modo o in qualche modo di avere #define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME?

Non ho davvero bisogno di questo per niente, questa domanda è per curiosità.

+0

vuoi solo capire la dimensione massima dell'array nello stack? forse la ricorsione funziona per te, allora? non in un singolo array ma in modo combinato? – tartar

+2

@tar Che cosa ha a che fare la ricorsione con questo? –

+0

Questo post non risponde alla tua domanda, ma dovrebbe essere una lettura interessante perché parla dello stesso problema di errore seg: http://stackoverflow.com/questions/851122/large-2d-array-gives-segmentation-fault –

risposta

10

non c'è un modo per determinare questo modo statico, perché il limite effettivodipende dalla quantità di spazio di stack è stato dato il tuo thread. Potresti creare un nuovo thread, dargli 10 megabyte di stack, e saresti in grado di allocare un array locale corrispondente più grande.

L'importo che è possibile allocare nello stack dipende anche da quanto è stato utilizzato fino a quel momento.

+0

Questo ha senso, suppongo di non capire troppo bene la differenza tra il modo in cui array statici e array dinamici vengono gestiti in termini di allocazione della memoria in fase di esecuzione – SirGuy

+3

Quando si dichiara una variabile locale, lo spazio per l'intero array viene assegnato dal stack space (questo è diverso da altri linguaggi come Java). Quando dichiari qualcosa di globale, al di fuori di una funzione, il linker imposta gli indirizzi di memoria in modo che lo spazio esista anche prima che il tuo programma inizi a girare. Lo stack ha una dimensione limitata (di solito 1 megabyte su un sistema operativo desktop moderno, ma può variare notevolmente), mentre lo spazio disponibile statico è l'intero spazio di indirizzamento dell'applicazione della macchina (2 GB o giù di lì su un sistema a 32 bit). –

+0

Esistono differenze di prestazioni tra questi due tipi di memoria? Inoltre, tutti i programmi usano lo stesso spazio statico, anche quando non sono in esecuzione? C'è qualche condivisione che si verifica nello spazio statico o se installi un programma zillion che potresti appena finire? Sto indovinando i problemi con questo non venire su molto spesso allora. – SirGuy

4
void foo(int level){ 
int dummy[100]; 
cerr<<level<<endl; 
foo(level+1); 
} 

Quindi, è possibile moltiplicare l'ultimo livello stampato con 400 byte. Le chiamate ricorsive occupano la maggior parte dello spazio di stack, ma credo che si possa ottenere un limite inferiore. Potrei perdere una certa comprensione della gestione della memoria qui, quindi aperta alle correzioni.

Quindi questo è quello che ho ottenuto sulla mia macchina con dimensioni dummy array variabili.

level array size stack total 
24257  100  9702800 
2597 1000  10388000 
    260 10000  10400000 
    129 20000  10320000 
    64 40000  10240000 
    25 100000  10000000 
    12 200000  9600000 
+0

Capisco ora cosa intendevi prima, grazie – SirGuy

+0

Ho giocato con quella soluzione per aumentare le dimensioni dell'array intero. Giusto per eliminare il peso aggiuntivo delle chiamate di funzione in ogni fase. Il massimo che ho ottenuto è quando la dimensione dell'array è 10000 e la dimensione massima dello stack sulla mia macchina (ubuntu 10.04) è 10400000 byte – tartar

+0

Attenzione all'ottimizzazione delle chiamate tail qui. –

1

Leggere this per comprendere le limitazioni impostate dall'hardware e dal compilatore. Non penso che tu possa avere un MAX definito per poterlo usare subito.

2

La maggior parte delle variabili dichiarate all'interno delle funzioni sono allocate su the stack, che è fondamentalmente un blocco di memoria di dimensioni fisse. Provare ad allocare una variabile di stack maggiore della dimensione dello stack causerà uno stack overflow, che è ciò che è causato dal segfault.

Spesso la dimensione dello stack è 8MB, così, su una macchina a 64 bit, long max[1000000] ha dimensioni 8*1000000 < 8MB (stack è "sicuro"), ma long max[2000000] ha dimensioni 8*2000000 > 8MB, così gli stack overflow e le segfaults programma.

D'altra parte, l'allocazione dinamica la matrice con malloc mette la memoria in the heap, che è sostanzialmente illimitata (4GB su una macchina a 32 bit, 17,179,869,184GB su una macchina a 64-bit).

Problemi correlati