Jus*_*rne 6 c optimization gcc
我最近遇到一个错误,在switch语句中初始化了一个变量.我开始玩这个更多,并意识到我不知道GCC在一些优化中试图做的第一件事.
int main(int argc, char** argv) {
switch (argc) {
case 1000: return 42;
int y = 24;
default: return y;
}
return argc;
}
Run Code Online (Sandbox Code Playgroud)
生成的代码总是返回42.发生了什么?为什么int y = 24一切都搞砸了?
$ gcc -Wall -Werror -O2 -c test.c
$ objdump -drwCS -Mintel test.o
testo.o: file format elf64-x86-64
Disassembly of section .text.startup:
0000000000000000 <main>:
0: b8 2a 00 00 00 mov eax,0x2a
5: c3 ret
Run Code Online (Sandbox Code Playgroud)
小智 4
int main(int argc, char** argv) {
switch (argc) {
case 1000: return 42;
int y = 24;
default: return y;
}
return argc;
}
Run Code Online (Sandbox Code Playgroud)
为了进一步解释这一点,开关并不完全执行线性进程。与此等效的逻辑是:
“如果 argc 为 1000,则返回 42。否则返回 y”
从未使用过,因为它int y = 24;从未达到,编译器可以对此进行优化,并且由于默认情况下有 UB,因此它也可能返回 42。
要解决此问题并按照我怀疑您的意图行事,您只需y在 switch 语句之外进行声明即可。
int main(int argc, char** argv) {
int y = 24;
switch (argc) {
case 1000: return 42;
default: return y;
}
return argc;
}
Run Code Online (Sandbox Code Playgroud)