Что не так с ключевым словом register в C++?

Я читал это, и там написано что ключевое слово register, скорее всего, будет удалено из следующего стандарта C++. В нем также говорится, что register устарел в 2011 году. Итак, что не так со спецификатором класса хранения register?

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

Однако эксперты по C++ также говорят, что никогда не следует использовать register. Таким образом, в чем проблема с ключевым словом register?


person Destructor    schedule 23.05.2015    source источник
comment
Я думаю, вы уже ответили: это была только рекомендация для компилятора, а компилятор может лучше оптимизировать хранение переменной.   -  person m0nhawk    schedule 23.05.2015
comment
Это бесполезный и иногда вводящий в заблуждение намек. (Подобно тому, как inline больше не означает, что функция будет встроенной, только то, что ее можно безопасно определить несколько раз).   -  person nneonneo    schedule 23.05.2015
comment
Рассмотрим другую сторону: что, если реализация поместит каждую register переменную в регистр? Как с этим можно было справиться? Некоторые ответы здесь.   -  person edmz    schedule 23.05.2015


Ответы (2)


Вы в значительной степени ответили на свой вопрос:

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

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

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

person Angew is no longer proud of SO    schedule 23.05.2015

Стандарт не требует, чтобы переменная register помещалась в регистры, вместо этого это просто подсказка компилятору для переменных, которые часто используются. И компилятор может определить это самостоятельно.

Здесь пункт о ключевом слове register из ссылки, которую вы разместили:

Спецификатор register указывает реализации, что объявленная таким образом переменная будет интенсивно использоваться. [ Примечание: подсказку можно игнорировать, и в большинстве реализаций она будет проигнорирована, если будет взят адрес переменной. Это использование устарело (см. D.2). -- конец примечания ]

person myaut    schedule 23.05.2015