我正在浏览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。
为什么他们有不同的组件?这是预期的吗?
答案 0 :(得分:2)
ptrB
和val
都不是restrict
,因此ptrB
和val
可能指向相同的long
。当他们这样做时,*ptrA += *val;
和*ptrB += *val;
的顺序很重要。
即使所有指针都是restrict
,编译器也只允许(而非必需)重新排列操作。