在速度方面,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)
这会改变什么吗?
答案 0 :(得分:2)
[是]有一种方法可以[承诺] [C ++]编译器在不超出标准[?] <的情况下不会为特定的指针参数加上别名 [..] 。 / p>
不,没有。
通常,您可以改用非标准的__restrict
,而使用was introduced to major toolchains来恰好填补了这一空白。就像您可能会想到的那样,可移植性并不是 这样的问题,因为GCC,Clang和Visual Studio都故意支持相同的关键字。
据称it's not trivial to add restrict
to the language,即使已经证明这样的关键字是完全可实现的(如上所述)。确实,它已经完成了。