Позволяет ли извлечение значений в локальные переменные большую оптимизацию в C/C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Позволяет ли извлечение значений в локальные переменные большую оптимизацию в C/C++?

Сообщение Anonymous »

Я часто задавался этим вопросом. Предположим, у вас есть цикл в функции или методе, например:

Код: Выделить всё

for (int i = 0; i < count; ++i)
...do stuff including function/method calls...;
Предположим, что count — это некоторая переменная, внешняя по отношению к функции — глобальная переменная, член данных объекта, выполняющего цикл, что угодно. Не локальная переменная. Мне кажется, что компилятор вообще не знает, может ли значение count измениться в ходе работы, выполняемой циклом, и поэтому ему приходится повторно получать значение count каждый раз. время прохождения цикла из любой ячейки памяти, в которой он находится; его нельзя, например, хранить в реестре. Если бы вы вместо этого написали:

Код: Выделить всё

int local_count = count;

for (int i = 0; i < local_count; ++i)
...do stuff including function/method calls...;
тогда вы сообщаете компилятору, что "значение count должно быть кэшировано в локальной переменной и использоваться, даже если исходное значение изменится". Это позволит, например, поместить его в регистр на время цикла.
Предположим, что значение count фактически не меняется в течение цикла. продолжительность цикла. Влияет ли эта разница в стиле кодирования на производительность типичного современного компилятора или нет? Насколько умны компиляторы в определении того, что «это значение не изменится и его не нужно получать повторно»? Обратите внимание: я не спрашиваю о изменчивости, насколько я понимаю; Я спрашиваю о возможности того, что раздел кода dothing изменит значение count (чего, я, не происходит, но компилятор, возможно, этого не делает) знаю).
Это встречается даже в более простых ситуациях, например:

Код: Выделить всё

use non-local variable foo;
...do stuff...;
use non-local variable foo again;
Предположим, я знаю, что значение foo не изменится. Должен ли я по-прежнему кэшировать его значение в локальной переменной для максимальной производительности? Нравится:

Код: Выделить всё

auto local_foo = foo;

use local_foo;
...do stuff...;
use local_foo again;
Я предполагаю, что это будет зависеть от компилятора, но я надеюсь, что можно сделать некоторые общие, полезные утверждения о том, насколько умны/глупы современные компиляторы, как правило, делают вывод о том, что значение не изменилось при установке высокого уровня оптимизации. Зависит ли это от встраивания? Оптимизация времени соединения? Другие соображения, такие как использование указателей в разделах «делать вещи», которые компилятор, по-видимому, не может предположить, не указывают на рассматриваемую внешнюю переменную? Есть ли более элегантный способ решения этой проблемы, чем создание повсюду копий данных с локальными переменными?
(Пожалуйста, не отвечайте на вопрос о преждевременной оптимизации, скажите мне, чтобы я не беспокоился о такие крошечные детали производительности и т. д.; я спрашиваю конкретно о контексте, в котором каждая мелочь производительности действительно имеет значение для рассматриваемого кода. Я работаю над симуляциями, на выполнение которых уходят дни или недели, часто с экстремальными моментами в коротком времени. И, пожалуйста, не говорите мне, что я должен вручную писать такой чувствительный к производительности код на ассемблере, если мне так хочется, но мое программное обеспечение должно работать кроссплатформенно на машинах конечных пользователей; это может быть macOS, Linux или Windows, поэтому сборка не является стартовой, и я действительно не знаю, на каком компиляторе я буду работать. Но мне действительно нужно выжать из компилятора максимальную производительность, насколько это возможно. возможно.)

Подробнее здесь: https://stackoverflow.com/questions/790 ... ion-in-c-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»