Ace*_*Src 8 c++ compiler-construction optimization assembly gcc
这是一个有界循环,它递增同一缓冲区的两个位置。
unsigned int getid();
void foo(unsigned int *counter, unsigned int n) {
unsigned int A = getid();
unsigned int B = getid();
for (unsigned int i = 0; i < n; i++) {
++counter[A];
++counter[B];
}
}
Run Code Online (Sandbox Code Playgroud)
根据编译器资源管理器(https://godbolt.org/z/b1sjf5669)的结果,即使在-O3优化级别,程序仍然存在涉及命令的循环add 1。
相反,如果++counter[B]删除,编译器可以减少循环并将程序优化为counter[A] += n. (https://godbolt.org/z/4YoPcz5rT)
为什么编译器是保守的,即不将代码转换为counter[A] += n, counter[B] += n这种情况?
我知道一些别名问题会导致循环减少失败。然而,这里只有一个缓冲区A=B,即使优化代码也不会改变结果。
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |