小编Hea*_*ell的帖子

GCC/Clang 未优化静态全局变量

GCC 似乎无法跟踪和优化在 C/C++ 中读/写全局变量的程序,即使它们是static,这应该允许它保证其他编译单元不会更改该变量。

编译代码时

static int test = 0;

int abc() {
  test++;
  if (test > 100) \
    return 123;
  --test;
  return 1;
}

int main() {
  return abc();
}
Run Code Online (Sandbox Code Playgroud)

使用标志-Os(以生成更短且更具可读性的程序集)和-fwhole-program/或-flto使用 GCC 版本 11.2 我希望将其优化为return 1或以下程序集:

main:
        mov     eax, 1
        ret
Run Code Online (Sandbox Code Playgroud)

这实际上是test局部变量所产生的结果。但是,会生成以下内容:

main:
        mov     eax, DWORD PTR test[rip]
        mov     r8d, 1
        inc     eax
        cmp     eax, 100
        jle     .L1
        mov     DWORD PTR test[rip], eax
        mov     r8d, 123
.L1: …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc clang compiler-optimization

2
推荐指数
1
解决办法
854
查看次数

标签 统计

c ×1

c++ ×1

clang ×1

compiler-optimization ×1

gcc ×1