它是有效的。gcc
将优化它,就像大多数现代编译器一样。还要记住 Donald Knuth 所说的话:
我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。
您可以通过比较汇编代码来检查它是否有效。使用例如diff
进行比较。要生成程序集使用-S
标志,gcc -S
. 它相当于gcc -S -O0
,因为默认优化级别为 0。因此,即使在最低级别的优化中,gcc
也会为您处理此变量。
第一个版本(为了更好的可读性更喜欢这种方式):
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
printf("%d ", i + j);
}
}
return 0;
}
第二个版本:
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
int j;
for (j = 0; j < 10; j++)
{
printf("%d ", i + j);
}
}
return 0;
}
相同的组装结果:
.file "main.cpp"
.section .rodata
.LC0:
.string "%d "
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
jmp .L2
.L5:
movl $0, -8(%rbp)
jmp .L3
.L4:
movl -8(%rbp), %eax
movl -4(%rbp), %edx
leal (%rdx,%rax), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
addl $1, -8(%rbp)
.L3:
cmpl $9, -8(%rbp)
setle %al
testb %al, %al
jne .L4
addl $1, -4(%rbp)
.L2:
cmpl $9, -4(%rbp)
setle %al
testb %al, %al
jne .L5
movl $0, %eax
leave
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
.section .note.GNU-stack,"",@progbits
int i
是-4(%rbp)
,int j
是-8(%rbp)
。如您所见int j
,没有重新分配或其他东西。