使われてない変数はgccの最適化で消えるのか?
- void.c
int main(void) {
return 0;
}
- unused_var.c
int main(void) {
int a = 3;
return 0;
}
この2つを アセンブリコードで出力の-S と最適化の-O2をつけてコンパイル
$ gcc -S -O2 filename.c
そして2つのdiffをとると,
$ cat unused_var.s | diff - void.s
1c1
< .file "unused_var.c"
---
> .file "void.c"
ファイル名以外は全く同じとなった. やはり,使われない変数は消されている.
以下のコードはgccでコンパイル時に警告が出る なぜなら,0で割り算しているから.
#include <stdio.h>
int main(void) {
int a = 3;
a /= 0;
printf("%d\n", a);
return 0;
}
しかし,以下のように変数に0を入れてからそれで割り算すると警告が出なくなった 変数zeroは実質定数になっているが,そこまでコンパイラは見てくれないか…
#include <stdio.h>
int main(void) {
int a = 3;
int zero = 0;
a /= zero;
printf("%d\n", a);
return 0;
}