[[(маловероятно)]] атрибуты и циклы 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;
}
Другие вопросы по тегам