结构中 restrict 关键字的行为
Behaviour of restrict keyword inside structs
场景:
假设我有一个 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
视为非别名?
应该。对于您在某处声明为 restrict
的每个指针,编译器可以假定它是对相应数据的唯一访问。通过声明这些,你实际上给了编译器保证。
是否所有编译器都会利用该信息是另一个问题。通过 struct
传递 restrict
指针不是很常见,所以你必须看看你的编译器做了什么。
我认为你的代码中有一个更大的问题:你将两个结构变量按值作为函数的输入传递
void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output)
这样做的效果是结构的每个成员都将被复制到堆栈上;这是大量浪费的堆栈 space 和此函数的大量开销。
此外,编译器将忽略此处的 restrict 限定符,因为结构不会像宏一样扩展,就编译器而言,有两个参数被传入结构类型,并且没有关于别名的指示。
这可能是您想要的:
void evaluate(struct bunch_of_ptr *restrict input, struct bunch_of_ptr *restrict output)
场景:
假设我有一个 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
视为非别名?
应该。对于您在某处声明为 restrict
的每个指针,编译器可以假定它是对相应数据的唯一访问。通过声明这些,你实际上给了编译器保证。
是否所有编译器都会利用该信息是另一个问题。通过 struct
传递 restrict
指针不是很常见,所以你必须看看你的编译器做了什么。
我认为你的代码中有一个更大的问题:你将两个结构变量按值作为函数的输入传递
void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output)
这样做的效果是结构的每个成员都将被复制到堆栈上;这是大量浪费的堆栈 space 和此函数的大量开销。 此外,编译器将忽略此处的 restrict 限定符,因为结构不会像宏一样扩展,就编译器而言,有两个参数被传入结构类型,并且没有关于别名的指示。
这可能是您想要的:
void evaluate(struct bunch_of_ptr *restrict input, struct bunch_of_ptr *restrict output)