C/C++

Чем именно обрабатываются не регистровые переменные если регистровые обрабатываются регистрами?

Нет хорошего примера использования регистров при использовании современных компиляторов (читай: последние 10+ лет), потому что это почти никогда не приносит пользы, а может и плохо. Когда вы используете регистр, вы говорите компилятору: «Я знаю, как оптимизировать свой код лучше, чем вы», что почти никогда не бывает. При использовании регистра может произойти одно из трех:

-- Компилятор игнорирует его, это наиболее вероятно. В этом случае единственный вред заключается в том, что вы не можете взять адрес переменной в коде.
--Компилятор выполняет ваш запрос, и в результате код работает медленнее.
-- Компилятор выполняет ваш запрос, и код работает быстрее, это наименее вероятный сценарий.
Даже если один компилятор производит лучший код при использовании регистра, нет оснований полагать, что другой сделает то же самое. Если у вас есть какой-то критический код, который компилятор недостаточно оптимизирует, лучше всего, вероятно, использовать ассемблер для этой части, но, конечно, сначала выполните соответствующее профилирование, чтобы убедиться, что сгенерированный код действительно является проблемой.
Amirkhan Uteshov
Amirkhan Uteshov
57 733
Лучший ответ
По умолчанию для хранения значения переменной используется оперативная память. Но работа с памятью намного медленнее, чем работа с регистрами процессора. Кроме того, для доступа к памяти по указателю значение указателя нередко надо сначала поместить в регистр процессора.

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

Современные компиляторы достаточно умны и производят вполне качественную оптимизацию: генерируемый ими код нередко работает даже быстрее, чем ассемблерный код, написанный вручную.

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

Но это именно просьба, которую компилятор вправе полностью проигнорировать. Раньше - потому, что регистров было мало (в компиляторе C для PDP-11 в регистрах можно было разместить не более трёх 16-битных переменных), сейчас - потому, что он умный и без подсказок разберётся.
Eretyk Eretyk
Eretyk Eretyk
69 632
Все переменные так или иначе через регистры попадают в процессор. И современным процессорам не надо тыкать на то что именно вот эту переменную держи в регистре подольше других, он и сам догадается. Поэтому слово registеr скорее всего будет проигнорировано.
Андрей Пеунин
Андрей Пеунин
51 416
А У МЕНЯ ШАПОЧКА ИЗ ФОЛЬГИ!
Ви
Виталий
28 020
Этот текст не актуален с конца 80х годов прошлого века.
Oxxxy Miron
Oxxxy Miron
12 593
Eretyk Eretyk Скорее, с конца 90-х.
завязывай бухать и куйню постить