auto i register to specyfikatory pamięci zmiennych w C.
auto historycznie oznacza automatyczną zmienną z zakresem widoczności w funkcji/bloku. Domyślnie wszystkie lokalne zmienne są auto, więc zazwyczaj nie ma sensu pisać to jawnie.
register prosi kompilator o przechowywanie zmiennej w rejestrze procesora w celu przyspieszenia dostępu. Jednak nowoczesne kompilatory same optymalizują przechowywanie, ignorując lub minimalnie reagując na to życzenie.
Zmiennych typu register nie można również adresować (&var jest zabronione).
Przykład:
register int counter = 0; auto float sum = 0.0f;
Czy można zadeklarować wskaźnik na zmienną register? Na przykład:
register int x = 5; int *p = &x;
Nie, nie można uzyskać adresu zmiennej register — to będzie błąd kompilacji. Specyfikator register zabrania operacji uzyskania adresu zmiennej.
Historia
W starym projekcie programista użył register dla zmiennych pętli, a następnie próbował przekazać ich adres do funkcji: foo(&i);. Kod nie kompilował się, wymagając usunięcia specyfikatora register. Błąd został zauważony dopiero podczas budowy, co opóźniło refaktoryzację.
Historia
Zespół próbował użyć register dla zmiennej o dużym rozmiarze (na przykład struktura). Kompilator zignorował to życzenie i przechował zmienną w pamięci, co nie dało oczekiwanego wzrostu wydajności, a programiści długo szukali przyczyny spowolnienia.
Historia
W kodzie masowo stosowano auto dla lokalnych zmiennych, sądząc, że to dobry styl (opierając się na innych językach). To zaśmiecało kod, nie wpływało na zachowanie, utrudniało czytanie i budziło pytania wśród kolegów.