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)