Jaka jest różnica międzyRejestracja słów kluczowych w języku C++
int x=7;
i
register int x=7;
?
Używam C++.
Jaka jest różnica międzyRejestracja słów kluczowych w języku C++
int x=7;
i
register int x=7;
?
Używam C++.
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.
Przykładowy bit może być przydatny. –
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
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
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 ...
kredyty linku do @Fred Larson – Tom
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.
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ą.
Zgodnie z Herb Sutter, register
jest "exactly as meaningful as whitespace" i nie ma wpływu na semantykę programu C++.
register
kluczowe było przydatne dla:
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
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. –
@SantiagoVillafuerte czy chcesz go dodać, edytując odpowiedź? – ncomputers
Nie jestem pewna mojej odpowiedzi ... chociaż brzmi to wiarygodnie. Wolę pozostawić komentarz jako komentarz, aby inni go zaakceptowali lub odrzucili. –
register
jest przestarzała aż C++ 17, jest nieużywany i zarezerwowany.
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
@GMan: ANSI C nie pozwala na pobranie adresu obiektu rejestru; to ograniczenie nie dotyczy C++ –
@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