提问者:小点点

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


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

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个答案

匿名用户

[Is]有一种方法可以[保证][C++]编译器不对特定的指针参数进行别名[..] 不必超出标准[?]

不,没有。

您通常可以改用非标准的__restrict,它被引入到主要的工具链中来正好填补这个空白。 可移植性并不像您所想的那么重要,因为GCC,Clang和Visual Studio都有意支持同一个关键字。

据称,向语言中添加restrict并不简单,尽管这样的关键字(如上所述)已经被证明是完全可以实现的。 事实上,已经做过了。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(告诉|c++|编译器|参数|别名)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?