Вопрос по c++, performance, caching, latency – Ключевое слово регистра все еще используется?

11

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

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

отредактировано, чтобы отразить выше user997112
@ user997112: Это вырвано из контекста.inline does иметь другие, реальные последствия. Kerrek SB
& quot; Это все еще используется & quot; это нечто совершенно иное, чем «если вы все еще используете это». harold
Ноinline это не только намек. Fanael
stackoverflow.com/questions/1443982/… & quot; примечание: inline - это только подсказка компилятору. Компилятор не обязан включать его. & # X2013; Локи Астари & quot; user997112

Ваш Ответ

6   ответов
5

гистров.

Кроме того, это всего лишь предложение для компилятора, в основном компиляторы могут выполнить эту оптимизацию самостоятельно, поэтому использование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!

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

@Fanael: я не уверен. В прошлый раз, когда я использовал регистрацию, это было почти никогда. Можете ли вы предоставить соответствующую цитату.
& Quot; -1 & Quot ;:int x; компилирует,intregisterx; не.
Вы сказали"it's as meaningful as whitespace".
@Fanael В C ++ это разрешено (тогда переменная не будет помещена в регистр), в C это ошибка.
Законно брать адресregister переменная, она ничего не предотвращает.
0

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

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

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

13

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 ]

Есть ли действительно существующий компилятор, который уважаетregister?
@AxelGneiting GCC делает (в C).
Текущие версии clang предупреждают, если вы вообще используете register в C ++ 11.
У вас есть источник для этого требования? Я был бы очень удивлен этим.
7

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 *).

5

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

register int* foo asm("a5");

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

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

3

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

На самом деле этоis просто посмотрите, почему у Termux нет openjdk: clang больше его не поддерживает, и OpenJDK mobile / jdk9 его использует.

Похожие вопросы