#include <cstdio>
__int128 idx;
int main() {
int a[2] = {1, 2};
idx++;
a[idx] = 0;
printf("%d %d", a[0], a[1]);
}
Run Code Online (Sandbox Code Playgroud)
打开 O2 后,a[idx] = 0 不执行。我想这不应该是未定义的行为。这是编译器中的错误吗?
我尝试了两种几乎相同的计算前缀和的方法,发现它们编译后有显着差异。编译选项是-O2.
不同的编译结果导致它们的运行时间相差4倍。
首先:
#include <numeric>
#include <algorithm>
int main() {
unsigned a[5000];
std::iota(a, a + 5000, 0);
for (int k = 0; k < 1'000'000; k++)
for (int i = 1; i < 5000; i++)
a[i] += a[i - 1];
return *std::min_element(a, a + 5000);
}
Run Code Online (Sandbox Code Playgroud)
第二:
#include <numeric>
#include <algorithm>
int main() {
unsigned a[5000];
std::iota(a, a + 5000, 0);
for (int k = 0; k < 1'000'000; k++)
for (int i = 0; i + 1 …Run Code Online (Sandbox Code Playgroud)