Есть ли какой-либо переносной способ подсказки предсказания ветвления? Рассмотрим следующий пример:Подсказки для предсказания переносимых ветвей
if (unlikely_condition) {
/* ..A.. */
} else {
/* ..B.. */
}
Является ли это по-другому, чем делать:
if (!unlikely_condition) {
/* ..B.. */
} else {
/* ..A.. */
}
Или это единственный способ, чтобы использовать компилятор конкретные советы? (например, __builtin_expect on GCC)
Будут ли компиляторы обрабатывать условия if
по-разному в зависимости от порядка условий?
Интересно, может ли это быть что-то атрибуты C++ 0x для использования на условиях 'if'? Как 'if ([[маловероятно]] маловероятное_состояние) {...}'? В настоящее время синтаксис этого не позволяет. Он * does * однако разрешает 'if ([[маловероятно]] bool b = ...) {}'. Возможно, это можно было бы злоупотреблять :) –
Код GNU содержит смехотворную сумму 'if (вероятно (...))' junk в полностью критическом для не-производительности коде, а IMO это действительно плохо. Во-первых, он не читается естественно на английском языке - это звучит так: «если это условие, скорее всего, будет истинным», а не «если это условие истинно, а это, вероятно, есть». А для другого это просто беспорядок. Если у вас нет особых критически важных условий, которые не будут компилироваться с 'cmov' или аналогичными уже, просто игнорируйте намеки на прогнозирование ветвлений. –
@R .. Думаю, я понимаю, почему ядро Linux завалено 'if (маловероятно (...))'. Они предпочитают ранние выходы, которые облегчают отслеживание потока кода. Если бы они этого не сделали, то предсказание статической ветви всегда терпело бы неудачу. –