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

Замена для устаревшего ключевого слова С++ 11

Я прочитал (здесь, например), что ключевое слово register устарело в С++ 11. Таким образом, эквивалент этого класса хранения спецификатор в новых версиях стандарта, или он позаботился о компиляторе?

4b9b3361

Ответ 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;
    }
}