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

标签 c pointers

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

The compiler can e.g. rearrange the code, first loading all memory locations, then performing the operations before committing the results back to memory.

后来,我注意到

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

为什么他们有不同的程序集?这是意料之中的事吗?

最佳答案

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

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

关于更改 "Restrict"ed 指针的顺序会产生不同的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50745990/

相关文章:

c - C中的初始化字符串

c - 数据类型的 sizeof 运算符错误

c++ - 列出数组未转换为指向单个元素的指针的所有情况?

c++ - 我在这里做错了什么?使用指向函数 typedef 的指针定义类。

c - 获取结构体的起始地址

c - 从客户端套接字获取命令序列

c - 多线程,每个线程都有唯一的变量

c - 在 C 中使用循环和函数的基本错误

c++ - 删除作为公共(public)类成员的指针

c - 将结构作为 void* 指针传递时初始化程序无效