C++20 可能还是不太可能?

C++20 Likely and UnLikely?

我正在阅读 https://iq.opengenus.org/cpp-likely-and-unlikely-attributes/,但我 understand/agree 很少阅读。

  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. 提出了以下声明:

% operation is a computationally heavy operation for cpu , so let's try to optimize our code.

虽然“优化”指的是添加 if-else 条件,但我使用 chrono 测试了代码,似乎没有 if-else 时执行时间快了 2-3 倍...

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

does it matter or make any difference if we make the else code [[likely]] or this happens automatically in background as if one side is likely then the other side isn't?

C++ 标准说的可能只是推荐的做法示例。参见 [dcl.attr.likelihood]。因此,它们的实际使用方式取决于实现。

虽然推荐的做法示例暗示只需要一个标记,并且观察到差异的编译器似乎暗示这作为嗯

Plus I don't see why % is heavy, it's just about reading bottom bits of number.

仅适用于二的幂。但是应该知道在编译时是2的幂。对于已知的非二次方常数 (Why does GCC use multiplication by a strange number in implementing integer division?),还有一种方法可以使此操作更便宜。

运行时值重,就是除法。

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