`restrict`关键字隐含的严格别名级别是多少?

时间:2013-11-01 16:43:13

标签: c arrays struct strict-aliasing

我有以下结构:

typedef struct{
    int data[LENGTH];
}Data;

并像这样使用它:

Data* dt=CALLOC(...)

int foo(Data* restrict d){
    for(...)
        d[i]->data[j];
    //do stuff with data[]
}

我的问题是:从d删除严格别名是否也会影响其成员,还是我需要单独使用restrict?换句话说,restrict是否暗示结构中包含的所有指针都得到相同的处理?

编辑:通过别名级别我的意思是,如果指向结构的指针得到restrict,那么包含在其中的任何其他指针也会受到限制(如同我的例子。)

1 个答案:

答案 0 :(得分:5)

restrict仅适用于带注释的指针本身(或通过指针算法生成的指针),而不适用于通过该指针检索的任何值。

我不确定'严格别名'的含义应该是什么意思,但restrict是一个比严格别名更强大的承诺。严格别名允许兼容类型的指针与别名:restrict是一个没有别名的承诺。