In C come molti di voi sanno, lo stack è dove risiedono tutte le variabili locali. La pila è la prima nella struttura dei dati dell'ultima uscita, quindi è possibile accedere solo a ciò che è stato inserito più recentemente su di esso. Quindi, dato il seguente codice:Qual è l'idea alla base dell'utilizzo di uno stack per le variabili locali?
int k = 5;
int j = 3;
short int i;
if (k > j) i = 1;
Ovviamente si tratta di codice inutile che non ha alcun significato reale, ma sto cercando di avvolgere la mia testa intorno a qualcosa.
Per la dichiarazione breve int i suppongo che 2 byte vengano allocati nello stack. Per int k e int j per entrambi i 4 byte ottenere assegnato con i valori 5 e 3. Così lo stack apparirebbe come segue
---------- <- stack pointer
int i
----------
int k = 5
----------
int j = 3
----------
così per l'istruzione if si dovrà pop l'INT per arrivare al condizioni k e j, e se sì, dove devo andare? Tutto ciò sembra molto dispendioso in termini di tempo e noioso se questo è il modo in cui C fa variabili locali.
Quindi, in questo modo, C fa o sto facendo il pieno?
in realtà il layout degli elementi nello stack è errato, in quanto io sono un corto, non un int. e uno stack cresce verso il basso nella memoria, non verso l'alto e le variabili locali sono messe in pila, nell'ordine inverso. Irregardless, qualsiasi valore sullo stack locale NON viene scoppiato piuttosto che viene usato un offset dal puntatore dello stack, quindi facendo riferimento a 'k' si ottiene "read word (alcuni registri) da sp [(offset a k)" allo stesso modo per 'j 'variabile. e 'i' è impostato come "scrivi halfword sp [offset a i] da (metà inferiore del registro che contiene il risultato di k + j) in generale puoi pensare allo stack come un lungo array con partizioni – user3629249