c - 更改“受限”指针的顺序会产生不同的程序集
问题描述
我正在浏览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。
为什么它们有不同的程序集?这是预期的吗?
解决方案
既不ptrB
是也不val
是restrict
,所以ptrB
和val
可以指向同一个long
。当他们这样做时,顺序*ptrA += *val;
很*ptrB += *val;
重要。
即使所有指针都是restrict
,编译器也只被允许而不是要求重新排列操作。
推荐阅读
- ruby-on-rails - 在 Github api 查询中获取所有存储库
- javascript - 我想将时间戳与当前时间减去一个月进行比较
- verilog - 14 位二进制到 4 位(16 位)bcd
- javascript - 如何生成和共享文件?
- r - 如何编写一个函数来循环变量并使用ggplot绘图
- python - 将从文件读取的整数或浮点数列表转换为 numpy 数组
- c++ - 如何在 C++ 中将“%Y%m%d”格式字符串转换为 time_t 变量?
- c++ - C++ 字符串单个字符
- jquery - jQuery - 如果值与数组中的元素匹配,则禁用复选框
- json - Instagram JSON 导出。使用 OPENJSON 透视子数组