"зарегистрировать" ключевое слово в C? - PullRequest
250 голосов
/ 23 февраля 2009

Что делает ключевое слово register на языке Си? Я читал, что он используется для оптимизации, но не четко определен ни в одном стандарте. Это все еще актуально, и если да, то когда бы вы его использовали?

Ответы [ 17 ]

4 голосов
/ 28 июня 2016

Просто небольшая демонстрация (без каких-либо реальных целей) для сравнения: при удалении ключевых слов register перед каждой переменной этот фрагмент кода занимает 3,41 секунды на моем i7 (GCC), с register тот же код завершается за 0,7 секунды.

#include <stdio.h>

int main(int argc, char** argv) {

     register int numIterations = 20000;    

     register int i=0;
     unsigned long val=0;

    for (i; i<numIterations+1; i++)
    {
        register int j=0;
        for (j;j<i;j++) 
        {
            val=j+i;
        }
    }
    printf("%d", val);
    return 0;
}
2 голосов
/ 23 февраля 2009

Регистр уведомит компилятор о том, что кодер полагал, что эта переменная будет записана / прочитана достаточно, чтобы оправдать ее хранение в одном из немногих регистров, доступных для использования переменной. Чтение / запись из регистров обычно быстрее и может потребовать меньшего набора кода операции.

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

2 голосов
/ 08 ноября 2015

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

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

Так много людей ошибочно рекомендуют не использовать ключевое слово register.

Посмотрим почему!

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

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

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

Когда в определенной точке потока команд значение переменной регистра присваивается в регистре процессора, и регистр не используется, поскольку для получения значения другой переменной компилятор знает, что ему не нужно перезагрузите значение переменной в этом регистре. Это позволяет избежать дорогостоящего бесполезного доступа к памяти.

Проведите собственные тесты, и вы получите значительное улучшение производительности в самых внутренних циклах.

c_register_side_effect_performance_boost

1 голос
/ 25 февраля 2011

Компилятор Microsoft Visual C ++ игнорирует ключевое слово register, когда включена глобальная оптимизация выделения регистра (флаг компилятора / Oe).

См. регистрация ключевого слова в MSDN.

1 голос
/ 23 февраля 2009

В поддерживаемых компиляторах C он пытается оптимизировать код, чтобы значение переменной сохранялось в фактическом регистре процессора.

1 голос
/ 14 июня 2012

Ключевое слово Register указывает компилятору сохранять конкретную переменную в регистрах ЦП, чтобы она была доступна быстро. С точки зрения программиста ключевое слово register используется для переменных, которые интенсивно используются в программе, так что компилятор может ускорить код. Хотя от компилятора зависит, будет ли переменная храниться в регистрах ЦП или основной памяти.

0 голосов
/ 14 июня 2012

Регистр указывает компилятору оптимизировать этот код, сохраняя эту конкретную переменную в регистрах, а затем в памяти. это запрос к компилятору, компилятор может или не может рассмотреть этот запрос. Вы можете использовать это средство в случае, когда к некоторым из ваших переменных обращаются очень часто. Например: зацикливание.

Еще одна вещь: если вы объявите переменную как регистр, вы не сможете получить ее адрес, так как он не хранится в памяти. он получает свое распределение в регистре процессора.

...