情景:
假设我有一个struct
类型,其中包含一堆指针,所有指针都声明为restrict
,而一个函数将这些struct
作为参数,如下所示:
struct bunch_of_ptr
{
double *restrict ptr00;
double *restrict ptr01;
...
double *restrict ptr19;
}
void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output)
{
// do some calculation on input and return results into output
}
根据http://www.oracle.com/technetwork/server-storage/solaris10/cc-restrict-139391.html,input.ptrXX
和input.ptrYY
将被视为非别名。
问题:
编译器是否会将input.ptrXX
和output.ptrYY
视为非别名?
答案 0 :(得分:2)
它应该。对于您在某处声明为restrict
的每个指针,编译器可以假定它是对相应数据的唯一访问。通过声明这些,您实际上为编译器提供了保证。
如果所有编译器都将利用该信息是另一个问题。将restrict
指针传递到struct
并不常见,因此您必须查看编译器的功能。
答案 1 :(得分:1)
我认为你的代码中存在一个更大的问题:你将两个结构变量按值作为函数的输入传递
void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output)
这样做的结果是结构的每个成员都将被复制到堆栈中;这是很多浪费的堆栈空间和这个功能的大量开销。 此外,编译器将忽略限制限定符,因为结构不像宏一样扩展,就编译器而言,有两个参数传递类型为struct,并且没有关于别名的指示。
这可能是你想要的:
void evaluate(struct bunch_of_ptr *restrict input, struct bunch_of_ptr *restrict output)