register în C++

Constante și specificatori C++98 (eliminat în C++17)

Fost specificator care sugera păstrarea variabilei într-un registru al procesorului; a fost eliminat în C++17, dar cuvântul rămâne rezervat.

Sintaxă
register int i;   // nu mai este permis din C++17

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 exemplu registru.

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.