为什么在此示例中使用 [[unlikely]] 属性?

问题描述 投票:0回答:1

我正在阅读https://iq.opengenus.org/cpp-likely-and-unlikely-attributes/,但我不理解/同意一些事情。

  1. 在以下代码中:

    void doModulus( vector<int> &vec , int mod ){
    
      // here the value of mod we are passing is 224, vec is of size 1024 holding values in [1,255]
    
      for( int i = 0 ; i<vec.size() ; i++ )
      {
          if( vec[i] >= mod ) [[unlikely]]{
              // so we are prioritizing  else statement here
              vec[i] = vec[i] % mod ;
    
          }else {
    
              vec[i] = vec[i] ;                         
          }
      }
    }
    

如果我们编写 else 代码

[[likely]]
,或者这会在后台自动发生,就好像一侧可能而另一侧不是一样,这是否重要或有什么区别? (尽管我希望如果一侧不太可能,那么另一侧(如果有可能的话)很有可能。

  1. 提出以下主张:

% 操作对于 cpu 来说是一个计算量大的操作,所以让我们 尝试优化我们的代码。

虽然“优化”是指添加 if else 条件,但我使用

chrono
测试了代码,看起来执行时间在没有 if-else 的情况下快了 2-3 倍...

另外,我不明白为什么 % 很重,它只是读取数字的底部位。

c++ cpu c++20 c++-chrono micro-optimization
1个回答
3
投票

如果我们编写 else 代码 [[可能]] 是否重要或有什么区别,或者这在后台自动发生,就好像一侧可能而另一侧不是?

C++ 标准可能只是提到了推荐实践示例。请参阅 [dcl.attr.likelihood]。因此,如何实际使用它们取决于实现。

尽管推荐的做法示例暗示只需要一个标记,并且观察到差异的编译器似乎也暗示了这一点。

另外,我不明白为什么 % 很重,它只是读取数字的底部位。

仅适用于 2 的幂。但应该知道,它在编译时是 2 的幂。对于已知的非二次方常数,还有一种方法可以使此操作更便宜(为什么 GCC 在实现整数除法时使用乘以奇怪的数字?)。

对于运行时值来说它很重,它是除法。

由于不断传播,优化器可能会知道某个值。然后进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.