Сколько плохого можно сделать, используя переменные регистра в C ++ - PullRequest
20 голосов
/ 29 мая 2011

Я только что узнал, что мы можем использовать регистры явно в программах на C ++. Интересно, что если я объявляю и использую все доступные регистры в одной программе на C ++ и запускаю ее в течение значительного количества времени? Насколько плохо будет вести себя моя система и какие (если таковые имеются) меры будут приняты ОС для выхода из ситуации.

Ответы [ 7 ]

24 голосов
/ 29 мая 2011

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

15 голосов
/ 29 мая 2011

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

  • Распространенное заблуждение: ключевое слово register
  • registerКлючевое слово .оказывают серьезное негативное влияние на современные системы.Каждый поток поддерживает свои собственные значения регистров во время выполнения, и его использование регистров не будет иметь прямого влияния на другие потоки.Компилятор либо отклонит, либо проигнорирует использование регистра, что не может привести к созданию жизнеспособной программы.Неправильное использование регистра в большинстве случаев просто снижает производительность, и ОС не предпринимает никаких специальных действий.
15 голосов
/ 29 мая 2011

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

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

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

Цитировать Херба Саттера на это:
Никогда не писать регистр.Это так же многозначно, как и пробел

6 голосов
/ 29 мая 2011

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

4 голосов
/ 29 мая 2011

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

Это хуже, чем бессмысленно.

Я видел код, в котором переменная, квалифицированная регистром, позже используется с "&".Код с десятками и десятками переменных, квалифицированных с помощью регистра.И в конечном итоге doozy, "зарегистрировать изменчивый foo;"

Никогда не используйте "зарегистрироваться".

4 голосов
/ 29 мая 2011

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

register - это в основном рудиментарный остаток старых, крайне неэффективных компиляторов C, которые были доступны еще в далеком прошлом.когда.(Те же компиляторы, которые привели к таким вещам, как выполнимое устройство Даффа и другие чудовища, на самом деле.) Современные компиляторы гораздо более способны, чем вы, отслеживать, какие переменные должны быть помещены в какие регистры и в какие точки выполнения.Таким образом, они будут вежливо игнорировать вас, не говоря ни слова.

1 голос
/ 29 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...