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

时间:2020-07-10 11:32:20

标签: c++ c hpc restrict-qualifier

在速度方面,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)

这会改变什么吗?

1 个答案:

答案 0 :(得分:2)

[是]有一种方法可以[承诺] [C ++]编译器在不超出标准[?] <的情况下不会为特定的指针参数加上别名 [..] 。 / p>

不,没有。

通常,您可以改用非标准的__restrict,而使用was introduced to major toolchains来恰好填补了这一空白。就像您可能会想到的那样,可移植性并不是 这样的问题,因为GCC,Clang和Visual Studio都故意支持相同的关键字。

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