小编pla*_*let的帖子

当 128 位整数有下标时,GCC 打开 O2 会导致错误

#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 不执行。我想这不应该是未定义的行为。这是编译器中的错误吗?

https://godbolt.org/z/qqccd9oEj

c++ gcc

6
推荐指数
1
解决办法
148
查看次数

使用 GCC 针对 x86-64 计算前缀和的两种看似等效的方法之间存在显着的速度差异

我尝试了两种几乎相同的计算前缀和的方法,发现它们编译后有显着差异。编译选项是-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)

c++ performance assembly gcc cpu-architecture

5
推荐指数
1
解决办法
154
查看次数

标签 统计

c++ ×2

gcc ×2

assembly ×1

cpu-architecture ×1

performance ×1