Domanda

Sono stato costruendo il mio compilatore e una gran parte di esso è, ovviamente, l'allocatore registro, che corrisponda variabili temporanee con i registri della macchina nel modo più efficiente possibile. Su un'architettura come la x86 non ci sono molti registri così ci sono un certo numero di fuoriuscite in cui le variabili devono essere memorizzati nella memoria (stack). Ci sono anche variabili memorizzate nella memoria, perché sono troppo grandi per entrare in un registro.

L'allocatore registro è effettivamente richiamato nuovamente per allocare le variabili in memoria in modo efficiente, in modo che tutto lo spazio è condiviso possibile. Il vero problema è che non c'è modo per vincolare l'allocatore registro di posizionare due variabili in memoria accanto all'altro (poiché posso poi dare variabili più grandi come un numero di variabili più piccole) e consentire l'allocatore per spostare le variabili più piccole intorno in modo che le variabili più grandi possono andare bene, e mi chiedo se ci sono eventuali algoritmi di tutto per gestire questo, altrimenti devo dividere la memoria in diverse aree, ognuna delle variabili di dimensioni diverse di partecipazione.

Ecco un esempio per dimostrare questo:

void f(){
    int32_t a, b;
    //something happens to a and b...
    int64_t c;
    //something happens to c...
}

Ci sono alcune ipotesi per rendere qui ai fini dell'esempio ... che le variabili non sono ottimizzati via, A e B non sono più utile una volta c è stato definito e che tutte le variabili sono assegnate alla pila memoria. Chiaramente vorrei 'c' di utilizzare la stessa memoria, come 'a' e 'b' appena usato e quindi allocare soltanto 8 byte, tuttavia la versione corrente del mio compilatore allocare un pieno 16 byte.

La mia domanda è, come posso allocare le variabili in memoria di diverse dimensioni in modo efficiente?

È stato utile?

Soluzione

Chiaramente l'allocatore registro non è sufficiente generale per allocare spazio di stack, poiché non ha senso a fondersi registri-at adiacenti almeno un sistema x86.

Perché non espanderlo di fare proprio questo? O, meglio ancora, dividere o sottoclasse a gestire direttamente registrare e stack allocazioni.

Per quanto riguarda l'allocatore pila, di solito non è tempo efficiente né particolarmente efficiente dello spazio per minimizzare la pila utilizzati nel caso (raro) che due variabili potrebbero condividere la stessa assegnazione causa di portata non sovrapponibili esecuzione. Le operazioni per allocare e rilasciare lo spazio dello stack extra alla transizione portata è improbabile che sia la pena. Anche nel più critica di elaborazione in tempo reale, uno è di solito molto più interessato robustezza e la velocità di rasatura pochi byte di spazio dello stack.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top