- 论坛徽章:
- 0
|
那这个恰当吧。
if(argc) 和if(0) 不同。后者可以被编译优化掉。前者还没有。
一样的。i[128]是在函数(不是块)进入就分好的。
- main(int argc, char **argv)
- {
- int i = atol(argv[1]);
- int k = 123;
- if(i) {
- int i[128];
- i[1] = 456;
- }
- }
- main(int argc, char **argv)
- {
- int i = atol(argv[1]);
- .file "tabc.c"
- .text
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- subl $536, %esp
- andl $-16, %esp
- movl $0, %eax
- addl $15, %eax
- addl $15, %eax
- shrl $4, %eax
- sall $4, %eax
- subl %eax, %esp
- subl $12, %esp
- movl 12(%ebp), %eax
- addl $4, %eax
- pushl (%eax)
- call atol
- addl $16, %esp
- movl %eax, -12(%ebp)
- movl $123, -16(%ebp)
- cmpl $0, -12(%ebp)
- je .L2
- movl $456, -532(%ebp)
- .L2:
- leave
- ret
- .size main, .-main
- .section .note.GNU-stack,"",@progbits
- .ident "GCC: (GNU) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)"
复制代码
原帖由 fedora_core_7 于 2007-5-23 22:08 发表
这个例子是不恰当的,因为 argc 永远不会是0,所以 if(argc) 相当于 if(TRUE), 故int a[128]一定会执行到,因此编译器为它分配了空间。如果你把 if(argc) 改成 if(0) 再看看汇编,编译器是不会为它分配空 ... |
|