在结构体内限制关键字的行为

时间:2015-02-12 13:09:33

标签: c struct c99 restrict-qualifier

情景:

假设我有一个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视为非别名?

2 个答案:

答案 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)