Nella prima risposta here, la seguente è stato accennato sulla memoria dello stack in C++:C++: come fa il compilatore a sapere quanta memoria allocare per ogni frame dello stack?
Quando viene chiamata una funzione, un blocco è riservato in cima alla pila per le variabili locali e alcuni dati contabili.
Questo rende perfettamente senso sul livello superiore, e mi fa curioso di come compilatori intelligente sono nell'assegnazione questa memoria di per sé, dato il contesto di this question: Poiché bretelle stessi non sono uno stack frame in C (Presumo che ciò valga anche per C++), voglio verificare se i compilatori ottimizzano la memoria riservata in base agli ambiti variabili all'interno di una singola funzione.
Di seguito Sto assumendo che la pila assomiglia a questo prima di una chiamata di funzione:
--------
|main()|
-------- <- stack pointer: space above it is used for current scope
| |
| |
| |
| |
--------
E allora la seguente dopo aver richiamato una funzione f()
:
--------
|main()|
-------- <- old stack pointer (osp)
| f() |
-------- <- stack pointer, variables will now be placed between here and osp upon reaching their declarations
| |
| |
| |
| |
--------
Ad esempio, dato questa funzione
void f() {
int x = 0;
int y = 5;
int z = x + y;
}
Presumibilmente, questo alloca solo 3*sizeof(int)
+ un po 'di spese generali extra per la contabilità.
Tuttavia, che dire di questa funzione:
void g() {
for (int i = 0; i < 100000; i++) {
int x = 0;
}
{
MyObject myObject[1000];
}
{
MyObject myObject[1000];
}
}
Ignorando le ottimizzazioni del compilatore che può elidere un sacco di roba in precedenza poiché in realtà non fanno nulla, io sono curioso di sapere quanto segue nel secondo esempio:
- Per il ciclo
for
: lo spazio dello stack sarà abbastanza grande da contenere tutti i 100000 pollici? - Inoltre, lo spazio di stack contiene
1000*sizeof(MyObject)
o2000*sizeof(MyObject)
?
In generale: il compilatore considera l'ambito variabile quando si determina la quantità di memoria necessaria per il nuovo stack frame, prima di richiamare una determinata funzione? Se questo è specifico del compilatore, come fanno alcuni noti compilatori a farlo?
Una coppia di '{}' è uno scope. Il ciclo riutilizza la stessa memoria per 'x', e i due matrici' myObject' non esistono allo stesso tempo. – LogicStuff
Perché è necessario allocare lo spazio per "100000" pollici, quando può riutilizzare lo stesso spazio? Lo stesso vale per gli array. –
Il compilatore esamina ogni ambito della funzione e lo spazio riservato è lo spazio massimo di tutti gli ambiti che possono esistere contemporaneamente. –