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
吗?
提前致谢.
您的代码导致未定义的行为.restrict
是你向编译器承诺所有指针参数指向不同的内存区域.
你通过提出&i
两个参数来打破这个承诺.
(事实上,restrict
允许它传递重叠指针,但只有在函数中没有通过任何重叠指针完成写入时才会发生.但通常你不会restrict
在没有写入的情况下烦恼).
FWIW,在我的系统上使用gcc 4.9.2,输出j = 20
处于-O0
或j = 10
等于-O1
或更高,这表明编译器确实注意到了restrict
.当然,由于它是未定义的行为,您的结果可能会有所不同.
归档时间: |
|
查看次数: |
62 次 |
最近记录: |