2014-12-15 15 views
19

Ho provato il programma seguente. L'intento con cui questo programma è stato creato è quello di scoprire di più sulle dimensioni dello stack.Dimensione massima stack per programma C/C +?

int main() 
{ 
    int nStack[100000000]; 
    return 0; 
} 

Dopo l'esecuzione del codice precedente, il programma si arresta in modo anomalo a causa di un'enorme allocazione delle dimensioni dello stack. Qual è la dimensione massima possibile della pila? È fissato per ogni programma/computer? Può essere aumentato?

Voglio sapere per motivi di conoscenza. Se qualcuno può fornire esempi in C/C++, sarebbe molto utile.

+0

Hai provato a usare questo? [getrlimit/setrlimit] (http://man7.org/linux/man-pages/man2/getrlimit.2.html) –

+0

Rimozione di '[java]' poiché la domanda non sembra essere correlata. –

+1

Pthreads consente di fornire il proprio stack per i nuovi thread.È possibile allocare una grande quantità di memoria in modo dinamico e quindi avviare un thread con quella memoria come stack. –

risposta

-1

Ho provato sotto il programma.

int main() 
{ 
    int nStack[519492]; 
    cout<<"Okay!"; 
    return 0; 
} 

L'output:

Okay! 

Ma se aumentare la dimensione della matrice da 1 byte, il programma si blocca.

int main() 
{ 
    int nStack[519493]; 
    cout<<"Okay!"; 
    return 0; 
} 

uscita:

No output. Program crashes. 
18

Qual è la dimensione massima dello stack?

A seconda dell'implementazione. Oggigiorno da uno a pochi megabyte è tipico del PC.

È stato risolto per ogni programma/computer?

In genere è stato risolto sul collegamento ma lo standard non lo definisce. Alcuni sistemi operativi possono limitare lo stack anche durante il runtime (ad esempio, RLIMIT_STACK su linux).

Può essere aumentato?

Potrebbe essere possibile a seconda dell'implementazione. Vedi la documentazione del tuo linker per i dettagli. E possibilmente anche la documentazione per il sistema operativo e il formato eseguibile.

Si dovrebbero allocare enormi array di questo tipo dinamicamente.

+0

in questo caso, come possiamo sapere quanta quantità di stack il nostro programma consumerà ??? – pkthapa

+0

@PKThapa In generale, ciò non è possibile. Per i programmi che non utilizzano array di ricorsione o di lunghezza variabile, in genere si può presumere che lo stack non diventerà troppo grande. – fuz

+0

In realtà, è in genere risolto dal linker, non dal compilatore. –

7

Per le applicazioni basate su Linux, è possibile utilizzare le API getrlimit e setrlimit per conoscere i vari limiti delle risorse del kernel, come la dimensione del file core, il tempo della CPU, la dimensione dello stack, i valori validi, max. no. dei processi ecc. 'RLIMIT_STACK' è il nome della risorsa per lo stack definito nel kernel di Linux. Qui di seguito è semplice programma per recuperare dimensione dello stack:

#include <iostream> 
#include <sys/time.h> 
#include <sys/resource.h> 
#include <errno.h> 
using namespace std; 

int main() 
{ 
    struct rlimit sl; 
    int returnVal = getrlimit(RLIMIT_STACK, &sl); 
    if (returnVal == -1) 
    { 
     cout << "Error. errno: " << errno << endl; 
    } 
    else if (returnVal == 0) 
    { 
     cout << "stackLimit soft - max : " << sl.rlim_cur << " - " << sl.rlim_max << endl; 
    } 
} 
-1

Per modificare la dimensione dello stack assegnato per il thread principale che viene generato dal caricatore processo per eseguire il codice al suo punto di ingresso, guardare la documentazione linker. È anche possibile modificare le dimensioni dello stack nei metadati dell'intestazione eseguibile.

+0

Sarebbe molto utile e informativo se condividi con noi su come modificare le dimensioni dello stack come quello che hai detto sopra. Non ne ho idea. – pkthapa

Problemi correlati