Pytanie w sprawie latency, performance, caching, c++ – Czy słowo kluczowe register jest nadal używane?

11

Właśnie natknąłem się na słowo kluczowe register w C ++ i zastanawiałem się, czy wydaje się to dobrym pomysłem (zachowanie pewnych zmiennych w rejestrze) z pewnością kompilator robi to domyślnie?

Zastanawiałem się, czy to słowo kluczowe jest nadal używane?

@ user997112: Lepsze wyjaśnienie „inline”, jeśli zamierzasz qote me:stackoverflow.com/questions/1759300/… Martin York
Aleinline to nie tylko wskazówka. Fanael
stackoverflow.com/questions/1443982/… "uwaga: inline jest tylko wskazówką dla kompilatora. Kompilator nie musi go wstawiać. - Loki Astari" user997112
edytowane, aby odzwierciedlić powyższe user997112

Twoja odpowiedź

6   odpowiedzi
5

Tylko konkretna liczba rejestrów jest dostępna dla dowolnego programu C ++.

Ponadto jest to tylko sugestia dla kompilatora, że ​​większość kompilatorów może zrobić tę optymalizację samodzielnie, więc nie ma zbyt dużego użyciaregister słowo kluczowe itd., ponieważ kompilatory mogą, ale nie muszą, stosować się do sugestii.

Więc jedyna rzeczregister słowo kluczowe robi z nowoczesnymi kompilatorami, uniemożliwia korzystanie& przyjąć adres zmiennej.

Używającregister słowo kluczowe po prostu uniemożliwia pobranie adresu zmiennej w C, podczas gdy w C ++ przyjęcie adresu zmiennej powoduje, że kompilator ignorujeregister słowo kluczowe.

Dolna linia to,Po prostu go nie używaj!

Ładnie wyjaśnione przez Herb:
Słowa kluczowe, które nie są (lub komentarze według innej nazwy)

@Cicada: tak, a to pytanie dotyczy C ++. Fanael
„-1”:int x; kompiluje,intregisterx; nie. Kerrek SB
Prawidłowe jest podanie adresuregister zmienna, nic nie przeszkadza. Fanael
@Fanael: Nie jestem pewien. Ostatnim razem, kiedy korzystałem z rejestru, prawie nigdy nie było tak. Czy możesz podać zgodny cytat. Alok Save
7

Standard mówi o tym (7.1.1 (2-3)):

Specyfikator rejestru stosuje się tylko do nazw zmiennych zadeklarowanych w bloku (6.3) lub do parametrów funkcji (8.4). Określa, że ​​nazwana zmienna ma automatyczny czas przechowywania (3.7.3). Zmienna zadeklarowana bez specyfikatora klasy pamięci w zasięgu bloku lub zadeklarowana jako parametr funkcji ma domyślnie czas automatycznego przechowywania.

Specyfikator rejestru jest wskazówką do implementacji, że tak zadeklarowana zmienna będzie mocno wykorzystywana. [Uwaga: Wskazówka może zostać zignorowana, aw większości implementacji zostanie zignorowana, jeśli adres zmiennej zostanie pobrany. To użycie jest przestarzałe (patrz D.2). - nota końcowa]

W podsumowaniu:register jest bezużyteczny, szczątkowy, atawistyczny i przestarzały. Jego głównym celem jest uczynienie życia ludzi trudniejszymi, którzy próbują wdrażać samorejestracyjne klasy i chcą nazwać główną funkcjęregister(T *).

5

Prawdopodobnie jedynym zdalnym poważnym zastosowaniemregister pozostało słowo kluczowe toRozszerzenie GCC który pozwala na używanie rejestru sprzętowego na stałe bez zestawu inline:

register int* foo asm("a5");

Oznacza to, że każdy dostęp dofoo wpłynie na rejestr procesoraa5.

To rozszerzenie ma oczywiście niewielkie zastosowanie poza kodem bardzo niskiego poziomu.

0

Słowo kluczowe „rejestr” jest przestarzałe od standardu C ++ 2011; widzieć„Usuń przestarzałe użycie słowa kluczowego rejestru”. Dlatego nie należy go używać.

W moich własnych eksperymentach odkryłem, że kod debugowania wygenerowany przez gcc (wersja 8.1.1) różni się, jeśli używane jest słowo kluczowe „register”; wygenerowany kod zespołu przydziela wyznaczone zmienne do rejestrów. Testy wykazały nawet, że ten kod działa szybciej (niż kod bez „rejestru”). Nie ma to jednak znaczenia, ponieważ kod wydania (zoptymalizowany) nie wykazywał żadnych różnic (tj. Użycie „rejestru” nie miało żadnego skutku). Vacbob stwierdzatutaj że jeśli włączona jest jakakolwiek optymalizacja, to gcc ignoruje „rejestr”. Moje własne testy to potwierdzają.

Podsumowując, nie używaj „rejestru” i jeśli kod debugowania wydaje się działać szybciej, gdy używany jest „rejestr”, należy pamiętać, że zoptymalizowany kod wydania nie będzie.

13

Większość implementacji po prostu ignorujeregister słowo kluczowe (chyba że narzuca błąd składniowy lub semantyczny).

Norma nie mówi również, że coś musi być przechowywane w rejestrze; tylko, że jest to wskazówka do wdrożenia, że ​​zmienna będzie używana bardzo często. Jego użycie jest nawet przestarzałe.

7.1.1 Specyfikatory klasy pamięci [dcl.stc]

3) Specyfikator rejestru jest wskazówką do implementacji, że tak zadeklarowana zmienna będzie mocno używana. [Uwaga: Wskazówka może zostać zignorowana, aw większości implementacji zostanie zignorowana, jeśli adres zmiennej zostanie pobrany. To użycie jest przestarzałe (patrz D.2). - nota końcowa]

Czy naprawdę istnieje kompilator, który szanujeregister? Axel Gneiting
@AxelGneiting GCC robi (w C). user703016
Bieżące wersje clang ostrzegają, jeśli w ogóle używasz rejestru w C ++ 11. leecbaker
Czy masz źródło tego roszczenia? Byłbym bardzo zaskoczony. Axel Gneiting
3

Nie, nie jest używany. To tylko podpowiedź i bardzo słaba. Kompilatory mają alokatory rejestru, mogą ustalić, które zmienne powinny być przechowywane w rejestrach (i uwzględnić rzeczy, o których prawdopodobnie nigdy nie pomyślałeś).

Tak naprawdę tojest po prostu spójrz, dlaczego Termux nie ma openjdk: clang już go nie obsługuje, a OpenJDK mobile / jdk9 go używa. Kaeptm Blaubaer

Powiązane pytania