如何在if-else语句中使用C ++ 20的可能/不太可能属性

时间:2018-08-11 08:36:41

标签: c++ gcc-warning c++20

这个问题是关于C ++ 20的[[likely]] / [[unlikely]]功能,而不是编译器定义的宏。

本文档(cppreference)仅给出了将其应用于switch-case语句的示例。 这个切换案例可以使用我的编译器(g ++-7.2)完美地编译,因此我认为编译器已经实现了此功能,尽管当前C ++标准中尚未正式引入该功能。

但是当我像这样if (condition) [[likely]] { ... } else { ... }使用它们时,我得到了警告:

  

“警告:语句开头的属性将被忽略[-Wattributes]”。

那么我应该如何在if-else语句中使用这些属性?

3 个答案:

答案 0 :(得分:9)

基于Jacksonville’18 ISO C++ Report的示例,该语法是正确的,但似乎尚未实现:

if (a>b) [[likely]] {

10.6.6 Likelihood attributes [dcl.attr.likelihood] draft

答案 1 :(得分:2)

  

那么我应该如何在if-else语句中使用这些属性?

正如您所做的一样,按照标准草案中给出的示例,您的语法是正确的(简化为仅显示相关位):

int f(int n) {
    if (n > 5) [[unlikely]] {
        g(0);
        return n * 2 + 1;
    }

    return 3;
}

但是您应该了解此功能是一个相对较新的功能,因此在实现中可能仅包含占位符来允许您设置属性。从您的警告消息中可以明显看出这一点。


您还应该 理解,除非最新的草案和最终产品之间的某些措辞发生变化,否则即使 compatible 实现也能够忽略这些属性。它们对编译器来说是很多建议,就像C中的inline。摘自最新的n4762草稿(在回答时,我重点强调):

  

注意:对可能性属性的使用旨在用于 allow 实现,以优化以下情况:包括它的执行路径比其他任何替代路径更可能出现在语句或标签上不包含此类属性的执行。

请注意单词“允许”,而不是“强制”,“要求”或“任务”。

答案 2 :(得分:2)

截至今天,cppreference指出,例如likely(强调我):

适用于一条语句,以允许编译器针对这种情况进行优化 包含该语句的执行路径比 任何不包括这样的替代执行路径 声明。

这表明放置属性的位置最有可能位于声明中,即:

if (condition) { [[likely]] ... } else { ... }

例如,使用/std:c++latest进行编译时,Visual Studio 2019 16.7.0接受这种语法。

相关问题