Перспектива предсказания переносимых ветвей в С++

Прогнозы ветвей были рассмотрены пару раз в StackOverflow. Однако я специально не нашел ответ на то, что я ищу. Во время фазы оптимизации мне нужно избегать неверного предсказания отрасли. И у меня есть ряд проверок, которые мне нужно сделать. Это выглядит так:

if(!successCondition)
    { throw Something(); }

Конечно, в нормальном ожидаемом рабочем процессе, который происходит в большинстве случаев, мы не генерируем исключение, поэтому мы не вводим if.

Я знаю, что в общей парадигме if/else мы можем намекнуть на компилятор, поставив наиболее вероятную ветвь в if, и менее вероятную в else (Первичное предсказание ветвления намеки). Но я не хочу (из-за читаемости) цепочки ifs:

if(successCondition)
    { whatever(); }
else
    { throw Something(); }

Таким образом, я понимаю, что компилятор будет по умолчанию одобрять запись в if, и я получу неверное предсказание ветки.

Я знаю, что gcc имеет определенную функцию для оптимизации кода, который вызван с маловероятным в ядре Linux (Программирование с учетом веток). Но он не переносимый, и мне нужен мой код.

Есть ли способ иметь правильное предсказание ветвления на С++, которое остается переносимым?

+4
05 янв. '18 в 21:42
источник поделиться
1 ответ

С++ 20, возможно, имеет атрибуты для этой цели. (Цель этого документа одобрена, но его формулировка еще не завершена.)

+3
05 янв. '18 в 22:13
источник

Посмотрите другие вопросы по меткам или Задайте вопрос