In che modo la CPU accede ai valori delle variabili allocate nello stack? [duplicare]

2

Considera la seguente funzione C ++:

void doStuff() {
    Thing thingA;
    Thing thingB;
    thingA.doSomething();
    // .. etc
}

Durante l'esecuzione di questa funzione, le variabili thingA e thingB sono allocate nello stack. Ciò significa che la variabile thingA rappresenta un indirizzo nello stack e il suo valore è ciò che viene assegnato in questo indirizzo (correggimi se ho torto).

Ciò che non capisco è questo: quando chiamiamo thingA.doSomething() , come fa la CPU a sapere quale sia l'indirizzo rappresentato da thingA ? Il valore mantenuto da thingA è attualmente nascosto nello stack sotto altri dati. In che modo la CPU sa qual è l'indirizzo che conduce a questo valore, al fine di raggiungere questi dati?

    
posta Aviv Cohn 10.10.2014 - 03:09
fonte

2 risposte

4

La prima cosa da notare è che per la CPU, lo stack è solo una parte della memoria totale che viene utilizzata in un modo particolare. Gli indirizzi degli oggetti sullo stack sono indistinguibili dagli indirizzi di altri oggetti (globali e oggetti allocati nell'heap).

Quando si richiama un metodo o una funzione, il compilatore sa dove si trovano l'oggetto ei parametri e dice al compilatore dove cercarli. Questo può essere un indirizzo di memoria o un registro della CPU.

A causa del modo in cui viene solitamente utilizzato lo stack, gli oggetti nello stack di solito non hanno un indirizzo fisso. Ma fanno hanno un indirizzo fisso relativo agli altri oggetti allocati allo stack nella stessa funzione e tale conoscenza viene utilizzata per determinare dove si trovano esattamente.
Nella maggior parte delle architetture della CPU, vengono utilizzati due registri per tenere traccia della parte superiore dello stack e della posizione in cui si trovano gli oggetti allocati nello stack nel richiamo della funzione corrente. Questi registri sono a volte indicati come rispettivamente il puntatore dello stack e il puntatore di base.

    
risposta data 10.10.2014 - 07:39
fonte
3

Il compilatore sceglierà un offset diverso dal puntatore dello stack per ogni variabile allocata allo stack. Ad esempio, stackPointer + 0 bytes potrebbe puntare a thingA e stackPointer + 8 bytes potrebbe puntare a thingB .

Il compilatore farà in modo che gli offset siano abbastanza grandi da non sovrapporsi alla memoria utilizzata per ciascuna variabile. In ogni chiamata di funzione, il puntatore dello stack viene spostato per creare spazio per le variabili del callee. Al ritorno della funzione, il puntatore dello stack viene reimpostato su dove si trovava nel chiamante, in modo che i riferimenti variabili nel chiamante funzionino ancora correttamente.

    
risposta data 10.10.2014 - 08:32
fonte

Leggi altre domande sui tag