有没有办法告诉C99编译器,我访问给定数组的唯一方法是使用myarrayindex?像这样说:
int heavy_calcualtions(float* restrict range1, float* restrict range2)
{
float __I promise I won't alias this__ tmpvalues[1000] = {0};
....
heavy calculations using range1, range2 and tmpvalues;
....
}通过使用restrict,我保证不会为range1和range2设置别名,但是如何对在函数中声明的数组做同样的事情呢?
发布于 2016-08-25 15:30:17
尽管Jeff的回答是正确的,也就是说,您总是可以使指针指向已分配的数组,但事实是,编译器在编译时知道tmpvalue不会被别名,因为变量被声明为实际的数组,而不是指针。为数组指定别名的唯一机会是声明指向该数组的指针,因此如果不这样做,就没有必要将其声明为restrict。如果tmpvalues是函数中唯一的变量,这一点就会更加明显。
如果您将指针传递给另一个函数,则可能会出现问题,然后您应该在那里声明接收到的指针是否受到限制。
我遇到的与此主题相关的文档包括C99
设D是一个普通标识符的声明,它提供了一种将对象P指定为类型T的限制限定指针的方法。
请注意,它只适用于指针。
TI的This other document使用restrict关键字提供了一些性能调优提示。除了所有提示之外,3.3节还提供了何时可以应用此类型限定符以及何时不可以应用此类型限定符的示例。查看第16页中间的x数组声明,它指出它没有声明指针,因此不能为restrict-qualified。
发布于 2015-04-29 05:07:20
为什么你不能这样做呢?您不会通过该变量访问与tmpvalues关联的数据,因此在代码的计算密集型部分使用限制指针是有效的。
#include <stdio.h>
#include <stdlib.h>
int heavy_calcs(int n, float* restrict range1, float* restrict range2)
{
if (n>1000) return 1;
float tmpvalues[1000] = {0};
{
float * restrict ptv = tmpvalues;
for (int i=0; i<n; i++) {
ptv[i] = range1[i] + range2[i];
}
}
return 0;
}
int main(int argc, char * argv[])
{
int n = (argc>1) ? atoi(argv[1]) : 1000;
float * r1 = (float*)malloc(n*sizeof(float));
float * r2 = (float*)malloc(n*sizeof(float));
int rc = heavy_calcs(n,r1,r2);
free(r1);
free(r2);
return rc;
}我通过Intel 15编译器运行它,它在向量化循环方面没有任何问题。诚然,与我假设的相比,这个循环是微不足道的,所以您的里程可能会有所不同。
https://stackoverflow.com/questions/19026643
复制相似问题