2010-07-08 19 views
60

Jaka jest różnica międzyRejestracja słów kluczowych w języku C++

int x=7; 

i

register int x=7; 

?

Używam C++.

+0

samo znaczenie jak w C++ w C, ergo jest to duplikat: http://stackoverflow.com/questions/578202/register-keyword-in-c Nie używaj słowa kluczowego, jest przestarzały. "Ma taką samą semantykę jak auto-specyfikator wraz z podpowiedzią do implementacji, że zadeklarowany obiekt będzie mocno używany."; jednak każdy nowoczesny kompilator wie, jak sprawić, by montaż wyjściowy był lepszy niż ty, pozwól mu wykonywać swoją pracę. – GManNickG

+7

@GMan: ANSI C nie pozwala na pobranie adresu obiektu rejestru; to ograniczenie nie dotyczy C++ –

+1

@Brian: Hm, masz rację. Jest to tylko w notatce (prawdopodobnie zostanie zignorowane, jeśli adres zostanie zajęty), ale nie będzie to wymagane. Dobrze wiedzieć. (Cóż, rodzaj.: P) – GManNickG

Odpowiedz

13

W języku C++ każdy prawidłowy program wykorzystujący słowa kluczowe "auto" lub "rejestracja" będzie semantycznie identyczny jak ten z usuniętymi słowami kluczowymi (chyba że pojawiają się one w uproszczonych makrach lub w innych podobnych kontekstach). W tym sensie słowa kluczowe są bezużyteczne dla właściwej kompilacji programów. Z drugiej strony, słowa kluczowe mogą być przydatne w pewnych kontekstach makr, aby zapewnić, że niewłaściwe użycie makra spowoduje błąd podczas kompilacji, zamiast tworzenia fałszywego kodu.

+18

Przykładowy bit może być przydatny. –

+0

Dobry artykuł o rejestrze jest tutaj, ale użyj google tłumacz z języka czeskiego na angielski, jest warta: http://amapro.cz/public/programovani/c/register/register.php – user1141649

+10

Ta odpowiedź nie jest już poprawna, od 2011 roku słowa kluczowego 'auto' nie można po prostu pominąć ... Być może mógłbyś zaktualizować swoją odpowiedź. – Walter

74

register to wskazówka dla kompilatora, zalecająca przechowywanie tej zmiennej w rejestrze procesora zamiast w pamięci (na przykład zamiast stosu).

Kompilator może, ale nie musi przestrzegać tej wskazówki.

Według Herb Sutter w "Keywords That Aren't (or, Comments by Another Name)":

Rejestr specifier ma te same semantykę jak auto specyfikatorem ...

+1

kredyty linku do @Fred Larson – Tom

20

Przy dzisiejszych kompilatory, prawdopodobnie nic. Jest to ordynacja wskazująca na umieszczenie zmiennej w rejestrze w celu szybszego dostępu, ale większość kompilatorów ignoruje tę podpowiedź i sama decyduje.

7

Prawie na pewno nic.

register to wskazówka dla kompilatora, który planuje się często używać x i że uważasz, że należy go umieścić w rejestrze.

Jednak obecnie kompilatory znacznie lepiej określają, jakie wartości powinny być umieszczone w rejestrach, niż przeciętny (lub nawet ekspert) programista, więc kompilatory po prostu ignorują słowo kluczowe i robią to, co chcą.

4

register kluczowe było przydatne dla:

  • montażu bezpośrednio.
  • Programowanie w języku C/C++.
  • Deklaracja zmiennych buforujących.

Przykładem systemu produkcyjnego, gdzie wymagana była kluczowe register:

typedef unsigned long long Out; 
volatile Out out,tmp; 
Out register rax asm("rax"); 
asm volatile("rdtsc":"=A"(rax)); 
out=out*tmp+rax; 

ona została zaniechana na C++17

+2

I dodałbym, że słowo kluczowe" register "byłoby użyteczne tylko w mikrokontrolerach z jednym programem C++ bez wątków i bez wielozadaniowości. Program C++ musiałby posiadać cały procesor, aby upewnić się, że zmienna "rejestracyjna" nie zostanie przeniesiona ze specjalnych rejestrów procesora. –

+0

@SantiagoVillafuerte czy chcesz go dodać, edytując odpowiedź? – ncomputers

+0

Nie jestem pewna mojej odpowiedzi ... chociaż brzmi to wiarygodnie. Wolę pozostawić komentarz jako komentarz, aby inni go zaakceptowali lub odrzucili. –

Powiązane problemy