auto e register sono modificatori di archiviazione delle variabili in C.
auto storicamente indica una variabile automatica con ambito di visibilità all'interno di una funzione/blocco. Per impostazione predefinita, tutte le variabili locali sono auto, quindi di solito non ha senso scriverlo esplicitamente.
register chiede al compilatore di memorizzare la variabile nel registro del processore per accelerare l'accesso. Ma i compilatori moderni ottimizzano autonomamente la memorizzazione, ignorando o rispondendo minimamente a questa richiesta.
Inoltre, le variabili di tipo register non possono avere un indirizzo (&var è vietato).
Esempio:
register int counter = 0; auto float sum = 0.0f;
Può essere dichiarato un puntatore a una variabile register? Ad esempio:
register int x = 5; int *p = &x;
No, non è possibile ottenere l'indirizzo di una variabile register — questo porterà a un errore di compilazione. Il modificatore register vieta l'operazione di ottenimento dell'indirizzo della variabile.
Storia
In un vecchio progetto, uno sviluppatore ha utilizzato register per le variabili del ciclo e poi ha tentato di passare il loro indirizzo a una funzione: foo(&i);. Il codice non si compilava, richiedendo di rimuovere il modificatore register. L'errore è stato scoperto solo durante la costruzione, prolungando il refactoring.
Storia
Il team ha tentato di utilizzare register per una variabile di grande dimensione (ad esempio, una struttura). Il compilatore ha ignorato la richiesta e ha memorizzato la variabile nella memoria, senza fornire il previsto aumento delle prestazioni, e gli sviluppatori hanno cercato a lungo la causa del rallentamento.
Storia
Nel codice è stato ampiamente usato auto per le variabili locali, ritenendolo un buon stile (facendo riferimento ad altri linguaggi). Questo ha ingombro il codice, non ha influenzato il comportamento, ha reso più difficile la lettura e ha suscitato domande tra i colleghi.