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

来自cppreference.com
< 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: 标号。

示例

#include <iostream>
 
int f(int i)
{
    if (i < 0) [[unlikely]] {
        return 0;
    }
 
    return 1;
}
 
int main()
{
    std::cout << f(-1) << std::endl;
 
    std::cout << f(1) << std::endl;
}