l1[]
и l2[]
удаляются во время оптимизации компилятора, потому что оба local and unused variables
(нет шансов, что обе переменные будут использоваться где-то еще).
вы можете скомпилировать свой код с опцией -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[]
глобален, он может быть полезен другой программой, если другой файл включает это. И компилятор не может оптимизировать глобальные объекты.
Ссылка: Как предотвратить мои «неиспользованные» компилируются глобальные переменные?
Итак, все благодаря оптимизации компилятора!
person
Grijesh Chauhan
schedule
16.01.2013