Ключевое слово регистра все еще используется?

Просто наткнулся на ключевое слово register в C ++, и мне стало интересно, так как это кажется хорошей идеей (сохранение определенных переменных в регистре), конечно, компилятор делает это по умолчанию?

Так что мне интересно, это ключевое слово еще используется?

Ответы на вопрос(6)

Ключевое слово & quot; регистрация & quot; устарел начиная со стандарта C ++ 2011 года; увидеть& quot; Удалить устаревшее использование регистра Ключевое слово & quot;, Поэтому его не следует использовать.

В своих собственных экспериментах я обнаружил, что код отладки, сгенерированный gcc (v8.1.1), действительно отличается, если «зарегистрировать» используется ключевое слово; сгенерированный ассемблерный код распределяет обозначенные переменные в регистрах. Тесты даже показали, что этот код работает быстрее (чем код без & quot; регистр & quot;). Однако это не имеет значения, поскольку код выпуска (оптимизированный) не показал различий (т. Е. Использование «регистра» не дало эффекта). Вакбоб утверждаетВот что если включена какая-либо оптимизация, то gcc игнорирует & quot; регистр & quot ;. Мои собственные тесты подтверждают это.

Таким образом, в общем, не используйте "зарегистрироваться" и если код отладки работает быстрее, когда & quot; register & quot; используется, имейте в виду, что оптимизированный код выпуска не будет.

Решение Вопроса

Большинство реализаций просто игнорируютregister ключевое слово (если только оно не навязывает синтаксическую или семантическую ошибку).

Стандарт также не говорит о том, что что-либо должно храниться в реестре; просто это намек на реализацию, что переменная будет использоваться очень часто. Его использование даже не рекомендуется.

7.1.1 Storage class specifiers [dcl.stc]

3) A register specifier is a hint to the implementation that the variable so declared will be heavily used. [ Note: The hint can be ignored and in most implementations it will be ignored if the address of the variable is taken. This use is deprecated (see D.2). — end note ]

Для любой программы на C ++ доступно только определенное количество регистров.

Кроме того, это всего лишь предложение для компилятора, в основном компиляторы могут выполнить эту оптимизацию самостоятельно, поэтому использованиеregister ключевое слово и многое другое, потому что компиляторы могут или не могут следовать предложению.

So the only thing register keyword does with modern compilers is prevent you from using & to take the address of the variable.

С использованиемregister Ключевое слово просто не позволяет вам получить адрес переменной в C, в то время как в C ++ взятие адреса переменной просто заставляет компилятор игнорироватьregister ключевое слово.

Итог есть,Just don't use it!

Хорошо объяснил Херб:
Ключевые слова, которые не доступны (или комментарии под другим именем)

Вероятно, единственно серьезное использование дляregister Ключевое слово слева являетсяРасширение GCC это позволяет вам использовать аппаратно-аппаратный регистр без встроенной сборки:

register int* foo asm("a5");

Это будет означать, что любой доступ кfoo повлияет на регистр процессораa5.

Это расширение, конечно, мало используется за пределами кода очень низкого уровня.

Стандарт говорит это (7.1.1 (2-3)):

The register specifier shall be applied only to names of variables declared in a block (6.3) or to function parameters (8.4). It specifies that the named variable has automatic storage duration (3.7.3). A variable declared without a storage-class-specifier at block scope or declared as a function parameter has automatic storage duration by default.

A register specifier is a hint to the implementation that the variable so declared will be heavily used. [ Note: The hint can be ignored and in most implementations it will be ignored if the address of the variable is taken. This use is deprecated (see D.2). — end note ]

В итоге:register бесполезен, рудиментарен, атавистичен и устарел. Его главная цель - сделать жизнь людей сложнее, которые пытаются внедрить саморегистрационные классы и хотят назвать основную функциюregister(T *).

Нет, он не используется. Это всего лишь подсказка, причем очень слабая. Компиляторы имеют распределители регистров, они могут выяснить, какие переменные должны храниться в регистрах (и учитывать вещи, о которых вы, вероятно, никогда не задумывались).

Ваш ответ на вопрос