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

Tell c++ compiler that the argument is not aliased

本文关键字:别名 参数 c++ 编译器 告诉      更新时间:2023-10-16

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]是否有一种方法可以向[C++]编译器[承诺]特定指针参数不会被别名[..]而不必超出标准[?]

不,没有。

您通常可以使用非标准的__restrict,它被引入到主要的工具链中,以填补这一空白。可移植性并不像你想象的那样是一个问题,因为GCC、Clang和Visual Studio都有意支持同一个关键字。

据称,将restrict添加到该语言中并非易事,尽管这样的关键字(如上所述(已被证明是完全可实现的。事实上,它已经完成了。