更改"限制" ed指针的顺序会产生不同的程序集

时间:2018-06-07 16:20:44

标签: c pointers

我正在浏览Wikipedia/Restrict,并发现

  

编译器可以例如重新排列代码,首先加载所有内存位置,然后在将结果提交回内存之前执行操作。

后来,我注意到了

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

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

请勿使用-Ofast生成相同的程序集。这适用于GCC和Clang。

您可以试用herehere

为什么他们有不同的组件?这是预期的吗?

1 个答案:

答案 0 :(得分:2)

ptrBval都不是restrict,因此ptrBval可能指向相同的long。当他们这样做时,*ptrA += *val;*ptrB += *val;的顺序很重要。

即使所有指针都是restrict,编译器也只允许(而非必需)重新排列操作。