registra la variabile in C e C ++

3

Conosco il concetto di variabile di registro e sono casi d'uso, ma nella mia mente ci sono alcune domande basate su ciò che ho provato.

  1. Non riesco ad accedere all'indirizzo di una variabile di registro in C anche se posso farlo in C ++! Perché? C'è qualche problema nell'accedere all'indirizzamento di una variabile di registro?

  2. Supponiamo che dichiari una variabile stringa in C ++ come registro, quindi dove verrà memorizzata quella variabile? Qual è il punto nel dichiarare la classe di archiviazione di tipi di dati non numerici come "stringa" in C ++ per essere registrati ??

UPDATE: Ho pensato che il C ++ ci permettesse di recuperare l'indirizzo di una variabile di registro, poiché non ricevevo alcun errore nel mio programma che è il seguente:

#include<iostream>
#include<time.h>

using namespace std;

clock_t beg, en;

int main(){

    int j, k=0;

    beg=clock();
    for(register int i=0;i<10000000;i++){
        /*if(k==0){
            cout<<&i<<endl;    // if this code is uncommented, then C++ rejects the recommendation to make 'i' as register
            k++;
        }*/
    }
    en=clock();

    cout<<en-beg<<endl;

    cout<<&j<<endl<<&k;

    return 0;
}

Quello che ho osservato è che se faccio la variabile 'i' come registro e non provo a stampare l'indirizzo usando '& i' allora C ++ accetta la raccomandazione e memorizza 'i' nel registro, questo può essere dedotto dal tempo di esecuzione del ciclo for che sarà sempre di circa 4-12 ms se 'i' è in registrazione. Ma se provo a stampare l'indirizzo della variabile "i", allora non ottengo alcun errore ma C ++ rifiuta la raccomandazione e questo può essere dedotto dal momento dell'esecuzione del ciclo che è sempre più di 25 se non sono registrato! !

Quindi, fondamentalmente non posso recuperare l'indirizzo di una variabile con la classe di archiviazione come registro !! PERCHE '?

    
posta kunal18 10.07.2013 - 00:27
fonte

1 risposta

12

Le variabili di un programma (su architetture moderne non incorporate) possono vivere in uno dei 2 posti, la RAM e i registri. La RAM è indicizzata e ai registri è possibile accedere direttamente negli opcode.

L'indirizzo di una variabile è l'indice in cui risiede nella RAM, un registro non vive nella RAM quindi non c'è modo di creare un indirizzo significativo per esso a meno che non lo metti nello stack ma che sconfigga il scopo della parola chiave register .

Per quanto la parola chiave sia divertente, in questi giorni i compilatori sono abbastanza bravi da decidere da soli quali variabili non devono mai essere copiate nello stack o meno (il ramo secondario è chiamato allocazione delle registrazioni ).

Come con la maggior parte delle ottimizzazioni della vecchia scuola che forniscono suggerimenti per l'ottimizzatore, è più probabile che la confondano e / o la ostacolino se non sai esattamente quali sono i risultati. Perché gli ottimizzatori sono orientati verso i costrutti idiomatici del linguaggio e, a meno che non ci sia un collo di bottiglia nella funzione, non ti preoccupare. Non radere 1 o 2 cicli di una funzione usata raramente quando il collo della bottiglia vero è l'accesso al DB.

    
risposta data 10.07.2013 - 01:15
fonte

Leggi altre domande sui tag