告诉 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,尽管这样的关键字(如上所述)已被证明是完全可以实现的。确实,已经做了。
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,尽管这样的关键字(如上所述)已被证明是完全可以实现的。确实,已经做了。