告诉 C++ 编译器参数没有别名

Tell c++ compiler that the argument is not aliased

C/C++ 和 Fortran 在速度方面的最大区别之一是前者语言使用可以别名的指针,因此编译器需要在每次循环迭代时加载数据而 Fortran 的分配器没有这个问题。

C 提供了关键字 restrict,因此您可以确保编译器指针没有被别名化。对于 c++,标准不提供此选项。我不愿意使用供应商扩展,因为我担心可移植性,但这也是我的应用程序的关键部分。因此,当它们对我的应用程序至关重要时,我不会不依赖标准之外的东西。

问题

我的问题是是否有办法确保 C++ 编译器不会为特定指针参数设置别名。 C++ 引用是否有任何帮助(即,由于我们处理的是非常大的数组,因此将引用作为按值传递的参数不是一种选择)?或者我应该简单地用 C 编写这些例程并从我的 C++ 应用程序调用它们?

  void HEAVY_CALC( double *p1, double *p2 , double *p3, int n1)
  {
     
       for(int i = 0; i<n1 ; i ++ ) {
           p1[i] = Func_1( ) ; 
           p2[i] = Func_2( ) ;  
           p3[i]= Func_3( ) ;  
       }
     
  }

因为这里的指针可能会被其他人引用,编译器将在每次 i 迭代时加载 p1、p2、p3。在 C 中,如果我添加 restrict 将得到解决。如果我添加一个引用而不是指针会发生什么,即

    void HEAVY_CALC( double* &p1, double *&p2 , double* &p3, int n1)

这会改变什么吗?

[Is] there is a way to [promise] the [C++] compiler that a specific pointer argument is not being aliased [..] without having to go beyond the standard[?]

没有,没有。

您通常可以使用非标准 __restrict 来代替,was introduced to major toolchains 正好可以填补这个空白。可移植性并不像您想象的那样 是一个问题,因为 GCC、Clang 和 Visual Studio 都特意支持相同的关键字。

据称,it's not trivial to add restrict to the language,尽管这样的关键字(如上所述)已被证明是完全可以实现的。确实,已经做了。