关于C关键字"限制"的一个令人费解的例子

Cho*_*oes 0 c keyword restrict

该示例来自维基百科:

void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val)
{
    *ptrA += *val;
    *ptrB += *val;
}
Run Code Online (Sandbox Code Playgroud)

我把这个函数称为main():

int main(void)
{
    size_t i = 10; 
    size_t j = 0;

    updatePtrs(&i, &j, &i);

    printf("i = %lu\n", i); 
    printf("j = %lu\n", j); 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

val指针没有根据维基百科的描述被加载两次,所以价值j应该是10,但它实际上是20.

我对这个关键字的理解不正确吗?我应该使用一些特定的选项gcc吗?

提前致谢.

M.M*_*M.M 5

您的代码导致未定义的行为.restrict是你向编译器承诺所有指针参数指向不同的内存区域.

你通过提出&i两个参数来打破这个承诺.

(事实上​​,restrict允许它传递重叠指针,但只有在函数中没有通过任何重叠指针完成写入时才会发生.但通常你不会restrict在没有写入的情况下烦恼).


FWIW,在我的系统上使用gcc 4.9.2,输出j = 20处于-O0j = 10等于-O1或更高,这表明编译器确实注意到了restrict.当然,由于它是未定义的行为,您的结果可能会有所不同.