告诉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]是否有一种方法可以向[C++]编译器[承诺]特定指针参数不会被别名[..]而不必超出标准[?]
不,没有。
您通常可以使用非标准的__restrict
,它被引入到主要的工具链中,以填补这一空白。可移植性并不像你想象的那样是一个问题,因为GCC、Clang和Visual Studio都有意支持同一个关键字。
据称,将restrict
添加到该语言中并非易事,尽管这样的关键字(如上所述(已被证明是完全可实现的。事实上,它已经完成了。
相关文章:
- 部分定义/别名模板模板参数
- 告诉c++编译器该参数没有别名
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 模板模板参数和模板别名:编译器错误?
- 为模板参数包添加别名
- C++使用默认模板参数键入别名和转发声明
- 缺少别名模板C++参数列表
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 必须非常量别名参数及其默认参数常量
- 作为模板参数 c++ 给出的类的别名模板
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 参数化类的别名(或类型定义)内部类
- C++别名的模板参数包扩展
- 如何简化模板模板参数中的enable_if别名
- 包含可变参数包的第一个可转换类型的别名的结构
- C++ 11 个模板,参数包的别名
- 为什么模板引用类型不能用作模板类型别名参数?
- 具有模板类默认参数的 C++17 别名模板
- 模板别名、变量模板和自动类型推断无法推断模板参数