【问题标题】:A puzzling example about the C keyword "restrict"关于 C 关键字“restrict”的一个令人费解的例子
【发布时间】:2016-03-23 10:55:32
【问题描述】:

The example 取自维基百科:

void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val)
{
    *ptrA += *val;
    *ptrB += *val;
}

我在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;
}

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

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

提前致谢。

【问题讨论】:

    标签: c keyword restrict


    【解决方案1】:

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

    您将&i 用于其中两个参数,从而打破了这个承诺。

    (事实上,restrict 允许传递重叠指针,但前提是没有通过函数内的任何重叠指针完成写入。但通常你不会打扰 restrict 如果没有写作发生)。


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

    【讨论】:

    • 我只是想理解这个关键字,所以我违背了诺言。如果对 gcc(5.2.1) 使用“-O1”,则为 10。
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多