Да, точно. Он используется для предоставления компилятору дополнительной информации о заявлении if
, чтобы он мог генерировать оптимальный код в соответствии с целевой микроархитектурой.
Хотя каждая микроархитектура имеет свои способы информирования о вероятности ветвления, мы можем взять простой пример из руководства Intel Optimization
Assembly/Составитель кодирования Правило 3. (M воздействие, H общность) Устройте код соответствовать алгоритм статического предсказания ветвлений: сделать fall- через код, следующий за условной ветвью, будет вероятной целью для ветки с forw ard, и сделать код падения после условной ветви - это маловероятная цель для ветви с обратной целью.
Проще говоря, статическое предсказание для передних ветвей не-принято (так что код после ветви спекулятивно выполняются, это вероятный путь), а для обратных ветвей принят (так что код после ветвь не спекулятивно выполняется).
Рассмотрим этот код для GCC:
#define probably_true(x) __builtin_expect(!!(x), 1)
#define probably_false(x) __builtin_expect(!!(x), 0)
int foo(int a, int b, int c)
{
if (probably_true(a==2))
return a + b*c;
else
return a*b + 2*c;
}
Где я использовал встроенный в __builtin_expect
для имитации [[problably(true)]]
.
Это компилируются в
foo(int, int, int):
cmp edi, 2 ;Compare a and 2
jne .L2 ;If not equals jumps to .L2
;This is the likely path (fall-through of a forward branch)
;return a + b*c;
.L2:
;This is the unlikely path (target of a forward branch)
;return a*b + 2*c;
ret
Где я избавлен вам некоторые сборки кода.
Если заменить probably_true
с probably_false
код становится:
foo(int, int, int):
cmp edi, 2 ;Compare a and 2
je .L5 ;If equals jumps to .L5
;This is the likely path (fall-through of a forward branch)
;return a*b + 2*c;
.L5:
;This is the unlikely path (target of a forward branch)
;return a + b*c;
ret
Вы можете играть с with this example at codebolt.org.
Это как раз то, что есть - видя предсказания аппаратной ветви – levengli
, это просто пример того, как может выглядеть атрибут, применимый только к условным ветвям, он действительно не существует в этой форме (насколько мне известно) – Cubbi
Я не уверен, правильно ли я понял вас, но я просто скомпилировал код с этим синтаксисом: '[[вероятно (правда)]] if (...) ... else ...' Я не сделал проверьте сгенерированный код, но он скомпилирован как минимум (с использованием msc и C++ 14) – Timo