Рассмотрим следующие циклы:
while((expressionA) & (expressionB)){
// do something
}
while((expressionA) && (expressionB)){
// do something
}
где expressionA
а также expressionB
выражения типа bool
а также expressionB
не имеет побочных эффектов. В этих условиях два случая как будто-эквивалент (верно?).
(Гипотетический) компилятор, который наивно полагается на исходный код, поместил бы ветвь в &&
версия и мы бы в конечном итоге платить за ошибки прогнозирования отрасли.
С современным компилятором (таким как текущий GCC), могут ли когда-либо быть условия, при которых &
версия дает существенный прирост производительности по сравнению с &&
версия?
Мое предположение нет, потому что:
expressionB
достаточно дешевый, компилятор распознает это и избегает создания короткозамкнутой ветви.expressionB
достаточно дорого, компилятор создаст короткое замыкание, потому что:
expressionA
не близко к 1.0, мы получаем существенный средний выигрыш в производительности от короткого замыкания.expressionA
близко к 1,0, мы не будем платить много, потому что предсказание ветвления будет иметь тенденцию к успеху.Задача ещё не решена.
Других решений пока нет …