首页 > 解决方案 > 更改“受限”指针的顺序会产生不同的程序集

问题描述

我正在浏览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。

你可以在这里这里试验它们

为什么它们有不同的程序集?这是预期的吗?

标签: cpointers

解决方案


既不ptrB是也不valrestrict,所以ptrBval可以指向同一个long。当他们这样做时,顺序*ptrA += *val;*ptrB += *val;重要。

即使所有指针都是restrict,编译器也只被允许而不是要求重新排列操作。


推荐阅读