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

Нет хорошего примера использования регистров при использовании современных компиляторов (читай: последние 10+ лет), потому что это почти никогда не приносит пользы, а может и плохо. Когда вы используете регистр, вы говорите компилятору: «Я знаю, как оптимизировать свой код лучше, чем вы», что почти никогда не бывает. При использовании регистра может произойти одно из трех:
-- Компилятор игнорирует его, это наиболее вероятно. В этом случае единственный вред заключается в том, что вы не можете взять адрес переменной в коде.
--Компилятор выполняет ваш запрос, и в результате код работает медленнее.
-- Компилятор выполняет ваш запрос, и код работает быстрее, это наименее вероятный сценарий.
Даже если один компилятор производит лучший код при использовании регистра, нет оснований полагать, что другой сделает то же самое. Если у вас есть какой-то критический код, который компилятор недостаточно оптимизирует, лучше всего, вероятно, использовать ассемблер для этой части, но, конечно, сначала выполните соответствующее профилирование, чтобы убедиться, что сгенерированный код действительно является проблемой.
-- Компилятор игнорирует его, это наиболее вероятно. В этом случае единственный вред заключается в том, что вы не можете взять адрес переменной в коде.
--Компилятор выполняет ваш запрос, и в результате код работает медленнее.
-- Компилятор выполняет ваш запрос, и код работает быстрее, это наименее вероятный сценарий.
Даже если один компилятор производит лучший код при использовании регистра, нет оснований полагать, что другой сделает то же самое. Если у вас есть какой-то критический код, который компилятор недостаточно оптимизирует, лучше всего, вероятно, использовать ассемблер для этой части, но, конечно, сначала выполните соответствующее профилирование, чтобы убедиться, что сгенерированный код действительно является проблемой.
По умолчанию для хранения значения переменной используется оперативная память. Но работа с памятью намного медленнее, чем работа с регистрами процессора. Кроме того, для доступа к памяти по указателю значение указателя нередко надо сначала поместить в регистр процессора.
Выгодно значения хотя бы части переменных хранить в тех регистрах, которые не используются в процессорном коде программы. Компилятор сам умеет оптимизировать код, используя свободные регистры для хранения значений наиболее активно используемых переменных. Но проблема в качестве такой оптимизации.
Современные компиляторы достаточно умны и производят вполне качественную оптимизацию: генерируемый ими код нередко работает даже быстрее, чем ассемблерный код, написанный вручную.
Но раньше (десятилетия назад) компиляторы были не столь совершенны и уровень оптимизации был намного ниже. Компилятор достаточно часто распределял переменные по регистрам неоптимальным образом. Было проще явно попросить компилятор использовать для конкретной переменной не память, а регистр, чем надеяться на качество оптимизации. В некоторых случаях это многократно ускоряло код.
Но это именно просьба, которую компилятор вправе полностью проигнорировать. Раньше - потому, что регистров было мало (в компиляторе C для PDP-11 в регистрах можно было разместить не более трёх 16-битных переменных), сейчас - потому, что он умный и без подсказок разберётся.
Выгодно значения хотя бы части переменных хранить в тех регистрах, которые не используются в процессорном коде программы. Компилятор сам умеет оптимизировать код, используя свободные регистры для хранения значений наиболее активно используемых переменных. Но проблема в качестве такой оптимизации.
Современные компиляторы достаточно умны и производят вполне качественную оптимизацию: генерируемый ими код нередко работает даже быстрее, чем ассемблерный код, написанный вручную.
Но раньше (десятилетия назад) компиляторы были не столь совершенны и уровень оптимизации был намного ниже. Компилятор достаточно часто распределял переменные по регистрам неоптимальным образом. Было проще явно попросить компилятор использовать для конкретной переменной не память, а регистр, чем надеяться на качество оптимизации. В некоторых случаях это многократно ускоряло код.
Но это именно просьба, которую компилятор вправе полностью проигнорировать. Раньше - потому, что регистров было мало (в компиляторе C для PDP-11 в регистрах можно было разместить не более трёх 16-битных переменных), сейчас - потому, что он умный и без подсказок разберётся.
Все переменные так или иначе через регистры попадают в процессор. И современным процессорам не надо тыкать на то что именно вот эту переменную держи в регистре подольше других, он и сам догадается. Поэтому слово registеr скорее всего будет проигнорировано.
А У МЕНЯ ШАПОЧКА ИЗ ФОЛЬГИ!
Этот текст не актуален с конца 80х годов прошлого века.
Eretyk Eretyk
Скорее, с конца 90-х.
завязывай бухать и куйню постить
Похожие вопросы
- Ассемблер. Зачем нужны связанные регистры?
- При совершении арифметических операций с переданными в рекурсивную функцию переменными, переменные меняются(Си)
- Если в редакторе имя переменной это строковое значение то после компиляции при поиске переменная есть как адресс?
- Глобальная переменная. (Си)
- Ввести с клавиатуры символ и преобразовать его в символ верхнего регистра. Как сделать без библиотеки string?
- Записать значения чисел фиббоначи в переменные и вернутт одновременно три значения переменных.
- Как создать под-переменную в python?
- Где располагается нессылочная переменная в ссылочном объекте с++?
- Для заданных с клавиатуры значений переменных x и n вычислить
- Лютый препод не унимается. Просит без ООП написать функцию обмена значениями переменных любого типа!