[[(маловероятно)]] атрибуты и циклы do-while
КОРОТКО: есть ли место для размещения атрибута, чтобы считалось, что поток управления в at может принять ложную ветвь, не влияя на возможность ветвей в?
if (cond1) {
do {
foo();
} while (cond2);
}
Если я положу
[[unlikely]]
в
do [[unlikely]] {
или же
do { [[unlikely]]
,влияет ли это? Поскольку истинная ветвь - это ЕДИНСТВЕННЫЙ путь, который входит в цикл, и это путь, который ВСЕГДА входит в цикл, согласно cppreference.com:
Применяется к оператору, чтобы позволить компилятору оптимизировать его для случая, когда пути выполнения, включающие этот оператор, менее вероятны, чем любой альтернативный путь выполнения, который не включает такой оператор.
похоже, что влияет.
Если я положу
[[likely]]
после цикла, например
do { foo(); } while(cond2); [[likely]];
, атрибут применяется к пустому оператору. Этот код неинтуитивен и становится более неясным,
cond2
и/или
cond1
находятся под влиянием.
Кстати, вопрос на самом деле спрашивает о семантике
[[(un)likely]]
атрибут, а не о реализациях, ни альтернативах, таких как
__builtin_expect
или разорвать цикл do-while для
foo(); while(cond2) [[unlikely]] foo();
.
1 ответ
Не решение, но в качестве альтернативы можно попробовать это:
while (1){
foo();
if (cond2) [[unlikely]]
break;
}