Подтвердить что ты не робот

Зарегистрировать ключевое слово в С++

В чем разница между

int x=7;

и

register int x=7;

?

Я использую С++.

4b9b3361

Ответ 1

В C++, существовавшем в 2010 году, любая действующая программа, использующая ключевые слова "auto" или "register", будет семантически идентична программе с удаленными этими ключевыми словами (если только они не появляются в строковых макросах или других подобных контекстах). В этом смысле ключевые слова бесполезны для правильной компиляции программ. С другой стороны, ключевые слова могут быть полезны в определенных контекстах макросов, чтобы гарантировать, что неправильное использование макроса приведет к ошибке времени компиляции, а не к созданию поддельного кода.

В C++ 11 и более поздних версиях языка ключевое слово auto было изменено, чтобы действовать как псевдотип для инициализируемых объектов, которые компилятор автоматически заменит на тип инициализирующего выражения. Таким образом, в C++ 03 объявление: auto int i=(unsigned char)5; было эквивалентно int i=5; при использовании в контексте блока, а auto i=(unsigned char)5; было нарушением ограничения. В C++ 11 auto int i=(unsigned char)5; стал нарушением ограничения, в то время как auto i=(unsigned char)5; стал эквивалентным auto unsigned char i=5;.

Ответ 2

register является подсказкой для компилятора, советуя ему хранить эту переменную в регистре процессора вместо памяти (например, вместо стека).

Компилятор может или не может следовать этому подсказке.

Согласно Herb Sutter в "Ключевые слова, которые не являются (или, комментарии от другого имени)" :

Спецификатор регистра имеет тот же семантика как автоматический указатель...

Ответ 4

С сегодняшними компиляторами, наверное, ничего. Является ли вначале намеком разместить переменную в регистре для более быстрого доступа, но большинство компиляторов сегодня игнорируют этот намек и сами решают.

Ответ 5

Почти наверняка ничего.

register является подсказкой для компилятора, который вы планируете использовать x много, и что вы думаете, что он должен быть помещен в регистр.

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

Ответ 6

Ключевое слово register было полезно для:

  • Встроенная сборка.
  • Программное обеспечение Expert C/С++.
  • Объявление кэшируемых переменных.

Пример продуктивной системы, где требуется ключевое слово register:

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

Он устарел на С++ 17

Ответ 8

Рассмотрим случай, когда оптимизатор компилятора имеет две переменные и вынужден пролить одну в стек. Так получилось, что обе переменные имеют одинаковый вес для компилятора. Учитывая, что нет никакой разницы, компилятор будет произвольно проливать одну из переменных. С другой стороны, ключевое слово register дает компилятору подсказку, к какой переменной будет обращаться чаще. Это похоже на инструкцию предварительной загрузки x86, но для оптимизатора компилятора.

Очевидно, что подсказки register аналогичны подсказкам вероятности перехода, предоставленным пользователем, и могут быть выведены из этих подсказок вероятности. Если компилятор знает, что некоторая ветвь используется часто, он будет хранить переменные, связанные с ветвями, в регистрах. Поэтому я предлагаю больше позаботиться о подсказках веток и забыть о register. В идеале ваш профилировщик должен как-то общаться с компилятором и избавить вас от мысли даже о таких нюансах.