Vai*_*Man 11 c++ c++20 likely-unlikely
简而言之:是否有一个地方可以放置属性,[[(un)likely]]以便控制流被cond2认为可能采取错误分支,而不影响分支的可能性cond1?
if (cond1) {\n do {\n foo();\n } while (cond2);\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我输入[[unlikely]]or do [[unlikely]] {\ do { [[unlikely]]xef\xbc\x8c ,它会影响\xef\xbc\x9f 因为根据cppreference.com 的cond1真实分支cond1是进入循环的唯一路径,并且是始终进入循环的路径:
\n\n应用于语句,以允许编译器针对包含该语句的执行路径比不包含此类语句的任何替代执行路径的可能性较小的情况进行优化。
\n
看来是cond1受到了影响。
如果我放在[[likely]]循环之后,例如do { foo(); } while(cond2); [[likely]];,则该属性将应用于空语句。该代码不直观,并且变得更不清楚是否cond2和/或cond1受到影响。
顺便说一句,问题实际上是询问[[(un)likely]]属性的语义,而不是关于实现,也不是诸如__builtin_expect或打破 do-while 循环之类的替代方案foo(); while(cond2) [[unlikely]] foo();。
Gos*_*low -1
我相信这是属性的正确放置:
if (cond1) [[likely]] {
do [[unlikely]] {
foo();
} while (cond2);
}
Run Code Online (Sandbox Code Playgroud)
这些属性只是示例,用于说明每个属性的放置位置。影响likely,if而unlikely影响do/while。令人困惑的是,该属性与条件相差甚远,但这似乎是它编译的地方。