结构中 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.htmlinput.ptrXXinput.ptrYY 将被视为无锯齿。

问题:

编译器是否也会将 input.ptrXXoutput.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)