Я не спрашиваю о таких вещах, как __builtin_expect
. Я имею в виду случай, когда я не знаю , что ветвь будет обычно истинной или обычно ложной, но я делаю знаю, что она предсказуема (или нет).
Я ожидаю, что компилятор, зная ветвь предсказуемую, с большей вероятностью будет генерировать ветки, а зная, что она непредсказуема, с большей вероятностью будет генерировать условно исполняемые инструкции без ветвей.
Возможно ли это в основных компиляторах? (Думая конкретно о gcc и clang).
Примеры, объясняющие, почему «предсказуемый» и «вероятный» не одно и то же
int x = rand()%2;
while (true) {
if (x) {
// do something
}
}
Оператор if
маловероятен или маловероятен, но весьма предсказуем.
while (true) {
if (rand()%5 > 0) {
// do something
}
}
В этом случае верно обратное: ветвление весьма вероятно (используется 80% времени), но непредсказуемо.