l1[] 和 l2[] 在编译器优化期间被删除,因为它们都是 local and unused variables(不可能在其他任何地方使用这两个变量)。
您可以使用-S 选项编译您的代码以生成汇编代码:并且在main 中没有l1[] 和l2[] 的定义,甚至在其他任何地方都没有:
输入文件为x.c,用命令gcc -S x.c编译生成汇编文件x.s
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movb $28, -4(%ebp)
movb $44, -3(%ebp)
movb $60, -2(%ebp)
movb $76, -1(%ebp)
leave
ret
.size main, .-main
.data
.type l2.1250, @object
.size l2.1250, 4
但是您可以找到g1[] and g2[] 的定义。
.file "x.c"
.globl g1
.data
.type g1, @object
.size g1, 4
g1:
.byte 26
.byte 42
.byte 58
.byte 74
.type g2, @object
.size g2, 4
g2:
.byte 27
.byte 43
.byte 59
.byte 75
.text
.globl main
.type main, @function
另外,如果你用标志-O3编译你的代码,如果你编译你会很有趣优化标志级别3那么只有g1[]的定义是展示。和全局静态变量(文件私有)也被删除。
输入文件为x.c,用命令gcc -S -O3 x.c编译生成汇编文件x.s
下面:
.file "x.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.globl g1
.data
.type g1, @object
.size g1, 4
g1:
.byte 26
.byte 42
.byte 58
.byte 74
.ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
g1[] 是仅存在的全局数据,g2[] 在-O3 中被删除。
g2[] 使用已定义的static unsigned char g2[],因此只能在此文件中访问,不要再次使用未使用的。但是g1[] 是全局的,如果其他文件包含它,它可能对其他程序有用。并且编译器不允许优化掉全局对象。
参考:How do I prevent my 'unused' global variables being compiled out?
所以,这一切都归功于编译器优化!