когда использовать регистры в C?

У меня есть что-то вроде этого

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

что это делает, это не имеет значения. Код выполняет быстро способ, которым это теперь, медленнее если ключевое слово регистра удалено. Однако, когда я добавляю в регистре перед интервалом n, он на самом деле работает медленнее, чем теперь, но быстрее чем если бы никакие регистры используется.

Кто-то может объяснить это мне? Спасибо.

11
задан D.C. 15 January 2010 в 01:05
поделиться

5 ответов

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

Это всего лишь подсказка, и компилятор не обязан ее понимать.

13
ответ дан 3 December 2019 в 02:20
поделиться

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

1
ответ дан 3 December 2019 в 02:20
поделиться

Для запроса пользователей, которые должны быть удалены, выполните команду

var delUsers = из u в db. MailListUsers где! userKeys.Содержит (u.UserKey) выберите u;

db.SunListUsers.StartAllOnSubmit (delUsers);

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

var newUserKeys = от u в userKeys где (db.SunListUsers.Where (j = > j. UserKey = = u. UserKey) .Count () = = 0) выбрать u;

Я не 100% уверен, что это сработает; Кроме того, можно выбрать все существующие пользовательские ключи, а затем перекрестную ссылку на них:

var newUserKeys = userKeys.Where (i = >! existingKeys.Contains (I.UserKey));

Опять же, не знаю всех последствий для производительности.

HTH.

-121--5044816-

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

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

-121--2898922-

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

16
ответ дан 3 December 2019 в 02:20
поделиться

Существует ограничение на распределительные регистры. Если вы выйдете, вы просто в конечном итоге с меньшим эффектом.

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

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

-1
ответ дан 3 December 2019 в 02:20
поделиться

В gcc регистр определённо не игнорируется, если не указать опции оптимизации. Тестирование вашего кода чем-то подобным

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

вы получаете (в зависимости от того, определен REG или пуст)

diff http://picasaweb.google.com/lh/photo/v2hBpl6D-soIdBXUOmAeMw?feat=directlink

Слева показан результат использования регистров.

4
ответ дан 3 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: