l1[]
并且l2[]
在编译器优化期间被删除,因为两者都是local and unused variables
(这两个变量都不会在其他任何地方使用)。
您可以使用选项编译代码以生成汇编代码:并且在 main-S
中没有定义, 甚至在其他任何地方都没有: 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[]
是全局的,如果其他文件包含它,它可能对其他程序有用。并且编译器不允许优化掉全局对象。
参考: 如何防止我的“未使用”全局变量被编译出来?
所以,这一切都归功于编译器优化!