У меня есть критическая база кода C ++, и я хочу улучшить (или, по крайней мере, измерить, если она стоит улучшить) вероятность, что Clang назначает филиалы, и в целом понимать, что он делает лучше (например, я не хочу перемещать код [[вероятно]] и [[неоднозначно]] , если это не необходимы, без необходимости, подобно нуждающемуся, такому не нуждающемуся в бок. Я использую Clang 20. Мне интересно: < /p>
Есть ли только две значимые вероятности (то есть, которые имеют отличное поведение), которые Clang может назначить для ветви, «вероятно» и «маловероятно», или есть больше? Например, существует ли «вероятная» вероятность того, что на практике есть часть поведения «вероятных» и некоторые из «маловероятных»? < /Li>
Как Clang выводит вероятность без контекста? Например, с учетом этой функции: < /li>
< /ul>
Код: Выделить всё
void foo() {
if (bar()) {
printf("bar is true, giving up\n");
return;
}
...
}
< /code>
решит, что небольшое количество, которое возвращается внутри него, может быть кодом обработки ошибок, и, таким образом, присвоить ему низкую вероятность? Что, если в IF-Statement вызывает функцию, помеченную __attribute __ ((CORD))
, функция с [[noreturn]] , функция в сборке релиза с Assert (ASSERT Получает особую обработку, или он использует какую-то существующую функцию компилятора, чтобы сказать, что его вызовая ветвь вряд ли) или какая-то другая вида аннотаторной функции? В целом, каковы все способы, которыми вызывает вероятность, что 20 человек? И, когда это вызывает вероятность, эффективно выбирает между двумя вероятностями, а это означает, что если я заберу, чтобы наклониться правильно, я получаю все возможные преимущества? Например, может быть, я просто отмечаю свою функцию log_error (...) с __attribute __ ((CORD)) , поскольку эта функция распространена в маловероятной филиалах, и забивать хороший компромисс между сложностью кода и производительностью.
Подробнее здесь:
https://stackoverflow.com/questions/797 ... nnotations