C++ 属性:likely, unlikely (C++20 起)

< cpp‎ | language‎ | attributes

允许编译器为包含该语句的执行路径,比任何其他不包含该语句的执行路径,更可能或更不可能的情况进行优化。

语法

[[likely]] (1)
[[unlikely]] (2)

解释

这些属性可应用于标号或语句(除了声明语句)。它们不可同时应用到同一标号或语句。

1) 应用到语句,允许编译器为包含该语句的执行路径,比任何其他不包含该语句的执行路径更可能的情况进行优化。
2) 应用到语句,允许编译器为包含该语句的执行路径,比任何其他不包含该语句的执行路径更不可能的情况进行优化。

当且仅当执行路径中含有到某个标号的跳转时,才认为该执行路径包含该标号:

int f(int i) {
    switch(i) {
    case 1: [[fallthrough]];
    [[likely]] case 2: return 1;
    }
    return 2;
}

i == 2 被认为比 i 的任何其他值更可能,但 [[likely]]i == 1 的情况无效果,尽管它直落到 case 2: 标号。

示例