【问题标题】:How to annotate a ternary expression with `[[likely]]`?如何用 `[[likely]]` 注释三元表达式?
【发布时间】:2021-07-29 22:31:11
【问题描述】:

在 C++20 中,有没有办法用 [[likely]]/[[unlikely]] 注释三元表达式以提示编译器这两个结果中哪一个更有可能?

以下语法似乎不起作用

condition ? [[likely]] function1() : function2()

是否有不同的语法来注释三元表达式?还是我必须改用if

【问题讨论】:

  • 编译器不关心哪个更有可能。如果您这样做,作为代码的读者,请添加评论。
  • 我不这么认为:"...这些属性可能适用于标签和语句..." en.cppreference.com/w/cpp/language/attributes/likely 和条件运算符的子句是表达式 - en.cppreference.com/w/cpp/language/operator_other
  • 更新:这个 "thing" 编译但是 (a) 它是一个 "thing" 并且 (b) 我不认为它做了什么你想要它......condition() ? []{[[likely]] function1();}() : function2(); - 直播 - godbolt.org/z/To3jo1frq
  • @jkb:编译器可以被关注,这就是[[likely]] 的重点。它可能能够生成在“可能”情况下更快的代码,但代价是另一个分支上的性能较慢,如果你能告诉它两者中哪一个实际上更有可能,那将是一个胜利。跨度>
  • GCC 有 __builtin_expect 可以这样使用:__builtin_expect(condition, true) : function1() : function2();

标签: c++ c++20


【解决方案1】:

是否有不同的语法来注释三元表达式?

不,没有办法用 [[likely]] 属性注释三元条件表达式。

或者我必须使用 if 代替吗?

是的。或者,您可以省略该属性。


不管怎样,使用 GNU 扩展是可能的:

__builtin_expect(!!condition, 1) ? function1() : function2()

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 2010-09-18
    • 2016-10-25
    • 2017-12-24
    • 2014-07-26
    • 1970-01-01
    • 2014-11-12
    • 2011-06-22
    相关资源
    最近更新 更多