1

场景:

假设我有一个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.ptrXXinput.ptrYY视为非别名。

问题:

编译器是否也会将input.ptrXXoutput.ptrYY视为非混叠?

4

2 回答 2

2

它应该。对于您声明为restrict某处的每个指针,编译器可以假定它是对相应数据的唯一访问。通过声明这些,您实际上为编译器提供了保证。

如果所有编译器都将利用该信息是另一个问题。传递restrict指针struct并不是很常见,所以你必须看看你的编译器做了什么。

于 2015-02-12T13:15:12.807 回答
-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) 
于 2015-02-12T16:08:26.170 回答