C++20的[[likely]]/[[unlikely]]属性可用于do-while循环条件吗?
结论
你观察到的写法语法合法,但不是该属性作用于do-while循环条件的标准推荐写法。
语法合法的原因
C++标准允许属性说明符序列出现在大多数语句的末尾位置。do-while循环是一个完整的语句,语法定义为:
do 语句 while ( 表达式 ) ;
分号是该语句的结束标记,你在分号后追加[[likely]]属性,属于在完整语句末尾附加属性的合法用法,因此三大主流编译器均不会报语法错误。
功能层面的风险
这种写法的实际优化效果是不可靠的:属性此时是作用于整个do-while语句本身,而非关联到while后的条件分支判断上,编译器可能不会将该属性识别为「循环条件成立是大概率路径」的分支提示。
标准推荐写法
如果要明确将[[likely]]/[[unlikely]]属性作用于do-while的条件分支,标准的放置位置是条件表达式之后、分号之前:
int main(int i, char**) { do { ++i; } while (i < 42) [[likely]]; return i; }
该写法符合C++20标准对分支属性的位置要求,所有支持该属性的编译器都会正确识别分支提示,生成符合预期的优化代码。
内容的提问来源于stack exchange,提问作者invexed
相关产品推荐
相关产品推荐

