Domanda

Ho qualcosa di simile

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

quello che fa, non importa. Il codice viene eseguito rapidamente il modo in cui è ora, più lenta se la parola chiave registro viene rimosso. Tuttavia, quando aggiungo nel registro prima di int n, in realtà viene eseguito più lentamente di adesso, ma più veloce se non si utilizza registri.

Qualcuno può spiegare questo a me? Grazie.

È stato utile?

Soluzione

register dà al compilatore un suggerimento per posizionare la variabile in un registro invece di spazio di memoria / stack. In alcuni casi, non ci sarà abbastanza registri per ogni variabile si posiziona questa parola chiave su così collocata su troppe variabili possono forzare alcuni degli altri fuori dei registri di nuovo.

Questa è solo un accenno, però, e il compilatore non deve prenderlo.

Altri suggerimenti

Come ha fatto il tempo presente? In pratica, register di solito non fa nulla. E 'un pezzo di cruft da quando la tecnologia compilatore era estremamente primitiva e compilatori non riusciva a capire allocazione dei registri stessi. Doveva essere un suggerimento per allocare un registro a quella variabile ed era utile per variabili utilizzate molto frequentemente. Oggigiorno, la maggior parte dei compilatori semplicemente ignorare e allocare registri secondo i propri algoritmi.

In gcc, il registro non è assolutamente ignorato, se non si specifica opzioni di ottimizzazione. Testare il codice con qualcosa di simile

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

si ottiene (a seconda se REG viene definito o vuoto)

diff http://picasaweb.google.com/lh/photo/v2hBpl6D- soIdBXUOmAeMw? impresa = DirectLink

A sinistra viene mostrato il risultato dell'utilizzo di registri.

Ci sono un numero limitato di registri disponibili, in modo marcatura tutto come il registro non mettere tutto in registri. Il benchmarking è l'unico modo per sapere se sta andando per aiutare oppure no. Un buon compilatore dovrebbe essere in grado di capire quali variabili mettere in registri da solo, in modo probabilmente si dovrebbe punto di riferimento ancora un po 'prima di decidere che le parole chiave di registro aiuta.

L'idea di utilizzare il registro è, la variabile viene utilizzata molto spesso. Se non v'è alcuna operazione con la variabile, verrà copiato in un registro in ogni caso. Così contatore (variabili indice) sono candidati per questo modificatore. Nell'esempio di Diego Torres Milano dal 15 '10 Jan alle 01:57 vorrei fare in questo modo:

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

C'è un limite ai registri allocatable. Se outgo esso, si finisce con il codice di meno efficiente.

La mia opinione è che se quello che fai è così importante che si deve decidere che cosa va in un registro e ciò che non lo fa, si dovrebbe scrivere utilizzando linguaggio assembly.

Per le lingue di uso generale, credo fermamente che un compilatore è meglio in grado di decidere che cosa va in un registro di un essere umano. La prova è che, mentre non siete sicuri di quante variabili si può mettere in registri, il compilatore sa con certezza.

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