Я прочитал (здесь, например), что ключевое слово register
устарело в С++ 11. Таким образом, эквивалент этого класса хранения спецификатор в новых версиях стандарта, или он позаботился о компиляторе?
Замена для устаревшего ключевого слова С++ 11
Ответ 1
Мы можем найти обоснование для устаревания регистра в отчет о дефекте 809: Отмена ключевого слова в регистре, в котором говорится (внимание мое):
Ключевое слово register выполняет очень мало функций, не предлагает больше чем подсказка, которую отмечает примечание, обычно игнорируется. Должен быть устарел в этой версии стандарта, освободив зарезервированное имя для использования в будущем стандарте, так же как и авто, было повторно использовано это время для того, чтобы быть таким же бесполезным.
удаление регистра для С++ 17 было одобрено в Lenexa, но он по-прежнему зарезервирован для будущего использования.
Ключевое слово register устарело в стандарте С++ 2011 года, как его эффект уже был неявным на языке. Он остается зарезервированным для будущее использование по стандарту, и пришло время удалить его рудиментарный спецификация.
Из-за правила as-if компилятор должен только эмулировать наблюдаемое поведение программы, и, следовательно, оптимизатор может через as- если правило решит сохранить переменную в регистре, если она не будет влиять на наблюдаемое поведение и, по-видимому, в большинстве случаев будет лучше выбирать, поскольку обычно она имеет больше информации.
Для справки также см. роль "зарегистрировать" ключевое слово C? в списке рассылки gcc
, один из ответы в потоке говорит:
Я не думаю, что ключевое слово "register" когда-либо затрагивало распределение регистров в gcc. Для этого вам нужно вернуться к компиляторам 1970-х годов.
Ключевое слово register все еще используется, однако, в gcc extension: gcc использует его в сочетании с asm для реализации регистра переменные.
Ответ 2
Никогда не было гарантии, что компилятор будет слушать вас, если вы использовали ключевое слово (и в некоторых случаях это была гарантия, что он игнорирует вас, например, если вы взяли адрес).
Эта возможность подсказки теперь устарела, и нет замены (это стандартное. inline asm не является стандартным, но может использоваться).
Ответ 3
Предполагается, что компилятор может назначать переменные для регистров лучше, чем программист, поэтому register
устарел и нет другого эквивалентного ключевого слова в новом стандарте.
Ответ 4
Просто отметим, что с помощью JetBrains ReShaper
в Visual Studio 2015
мне сказали, что register
ключевое слово устарело в C++11
и удалено в C++17
и предложило мне заменить его ключевым словом auto
для этой части код:
float constant = 1.0f / 478.01;
int centerX = (pointcloud.width >> 1);
int centerY = (pointcloud.height >> 1);
auto depth_idx = 0;
for (auto v = -centerY; v < centerY; ++v)
{
for (auto u = -centerX; u < centerX; ++u, ++depth_idx)
{
pcl::PointXYZ& pt = pointcloud.points[depth_idx];
pt.z = depth_data[depth_idx] * 0.001f;
pt.x = static_cast<float> (u) * pt.z * constant;
pt.y = static_cast<float> (v) * pt.z * constant;
}
}