Ce face register
În anii ’70-’80, compilatoarele erau simple, iar programatorul putea scrie register int i; ca să sugereze că variabila e folosită foarte des și ar trebui ținută într-un registru al procesorului (cea mai rapidă memorie). Compilatoarele moderne aleg singure mult mai bine ce stă în registre, așa că sugestia era ignorată.
În C++11, register a fost declarat învechit, iar în C++17 a fost eliminat: codul care îl folosește nu se mai compilează cu un standard modern. Cuvântul rămâne totuși rezervat (nu poți numi o variabilă register), pentru o eventuală folosire viitoare.
Dacă întâlnești register în cod vechi, șterge-l pur și simplu: programul se comportă la fel. (În limbajul C, register există în continuare.)
Exemple
Exemplul 1: Cod vechi care nu se mai compilează
Compilat cu -std=c++23, clang refuză codul. Rezultatul de mai jos este mesajul real al compilatorului (clang 21).
#include <print>
int main() {
register int suma = 0;
for (register int i = 1; i <= 10; ++i) {
suma += i;
}
std::println("Suma: {}", suma);
}
Eroare de compilare
exemplu.cpp:4:5: error: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
4 | register int suma = 0;
| ^~~~~~~~
exemplu.cpp:5:10: error: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
5 | for (register int i = 1; i <= 10; ++i) {
| ^~~~~~~~
2 errors generated.
Exemplul 2: Același cod, scris corect astăzi
Doar ștergem register. Compilatorul păstrează oricum suma și i în registre când optimizează.
#include <print>
int main() {
int suma = 0;
for (int i = 1; i <= 10; ++i) {
suma += i;
}
std::println("Suma: {}", suma);
}
Rezultat
Suma: 55
Greșeli frecvente
- Copiezi cod vechi de C sau C++98 cu
registerși te miri că nu se compilează. Șterge cuvântul; nu schimbă comportamentul programului. - Încerci să numești o variabilă
register(de exemplu pentru un registru de casă). Cuvântul este încă rezervat; alege alt nume, de exempluregistru.
Comenzi înrudite
int: Tipul de bază pentru numere întregi (fără zecimale), de obicei pe 4 octeți, cu valori între aproximativ -2,1 și 2,1 miliarde.volatile: Spune compilatorului că valoarea se poate schimba din afara programului, deci fiecare citire și scriere trebuie făcută efectiv.auto: Lasă compilatorul să deducă tipul variabilei din valoarea cu care este inițializată.static: Are trei sensuri: variabilă locală care își păstrează valoarea între apeluri, membru comun al clasei sau nume vizibil doar în fișierul curent.