【发布时间】:2022-07-20 03:37:46
【问题描述】:
简短说明:是否有放置[[(un)likely]] 属性的地方,以便cond2 处的控制流被认为可能采取错误分支,而不影响cond1 处分支的可能性 em>?
if (cond1) {
do {
foo();
} while (cond2);
}
如果我把[[unlikely]]放在do [[unlikely]] {或do { [[unlikely]]中,会影响cond1吗? 因为cond1的真分支是进入循环的ONLY路径并且是 ALWAYS 进入循环的路径,根据cppreference.com:
应用于语句以允许编译器针对包含该语句的执行路径比不包含此类语句的任何替代执行路径不太可能的情况进行优化。
cond1 似乎受到了影响。
如果我将[[likely]] 放在循环之后,例如do { foo(); } while(cond2); [[likely]];,属性应用于空语句。此代码不直观,并且不清楚cond2 和/或cond1 是否受到影响。
顺便说一句,问题实际上是询问[[(un)likely]] 属性的语义,而不是关于实现,也不是__builtin_expect 之类的替代方案,或者将do-while 循环中断为foo(); while(cond2) [[unlikely]] foo();。
【问题讨论】:
-
do { foo(); } while(cond2) [[likely]];有什么问题? -
@GoswinvonBrederlow 无法编译。
-
似乎唯一的解决方法是定义一个类似于
__builtin_expect的函数,例如inline bool unlikely_cond(bool cond) { if (cond) [[unlikely]] { return true; } else { return false; } },然后使用unlikely_cond(cond2)。但是我还是不明白[[(un)likely]]属性的exact语义。
标签: c++ c++20 likely-unlikely