効率的です。gcc
最近のほとんどのコンパイラと同様に、それを最適化します。また、Donald Knuth 氏の次の言葉も覚えておいてください。
約 97% の確率で、わずかな効率性を忘れる必要があります。時期尚早の最適化は諸悪の根源です。
アセンブリコードを比較することで効率的であることを確認できます。たとえばdiff
、比較を行うために使用します。アセンブリ使用-S
フラグを生成するには、gcc -S
. デフォルトの最適化レベルは 0 であるため、これは と同等gcc -S -O0
です。したがって、最低レベルの最適化でも、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;
}
2 番目のバージョン:
#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
、再割り当てなどではありません。