if (var != X)
var = X;
Это разумно или нет? Будет ли компилятор всегда оптимизировать инструкцию if? Существуют ли какие-либо варианты использования, которые могли бы выиграть от оператора if?
Что делать, если var
является изменчивой переменной?
Мне интересны как ответы на С++, так и Java, поскольку изменчивые переменные имеют разные семантики на обоих языках. Также JIT-компиляция Java может иметь значение.
Оператор if вводит разветвление и дополнительное чтение, которое не произошло бы, если бы мы всегда перезаписывали var с X, так что это плохо. С другой стороны, если var == X
, то, используя эту оптимизацию, мы выполняем только чтение, и мы не выполняем запись, которая может иметь некоторые эффекты для кеша. Ясно, что здесь есть некоторые компромиссы. Я хотел бы знать, как это выглядит на практике. Кто-нибудь пробовал на этом тестирование?
EDIT:
Мне больше всего интересно, как это выглядит в многопроцессорной среде. В тривиальной ситуации, кажется, нет большого смысла в проверке переменной в первую очередь. Но когда согласованность кеша должна поддерживаться между процессорами/ядрами, дополнительная проверка может быть действительно полезной. Мне просто интересно, как это может повлиять на ситуацию? Также не должен ли процессор делать такую оптимизацию? Если var == X
присвоить его еще раз значение X
не должно "загромождать" кеш. Но можем ли мы полагаться на это?