これが依存しますコードのパフォーマンス、サイズ、メンテナンス性/可読性など、いつものように。 ほとんどの場合、保守と可読性が必要なため、明示的な変数名でコードをクリアし、混乱を避けるためにコードを再利用しないでください。 タイムクリティカルなコードや低リソースシステムでは、スタックをあまりにも多くロードすることを避けたいので、おそらく多くを再利用したいと思うでしょう。
コンパイラがC99に準拠している場合は、変数の有効範囲を制限して使用することはできますが、コンパイラがこれをうまく処理せず、場合によってスタックをロードし続けることがあります。関数フレームの例restrict.cスタックの使用は次の は、GCC 4.8.2に
reuse.cより高い例:restrict.c
int main(int argc, char** argv)
{
int a=0;
for(int i1=0;i1<10;i1++){
a++;
}
for(int i2=0;i2<10;i2++){
a++;
}
for(int i3=0;i3<10;i3++){
a++;
}
for(int i4=0;i4<10;i4++){
a++;
}
return 0;
}
例:reuse.c
int main(int argc, char** argv)
{
int i, a=0;
for(i=0;i<10;i++){
a++;
}
for(i=0;i<10;i++){
a++;
}
for(i=0;i<10;i++){
a++;
}
for(i=0;i<10;i++){
a++;
}
return 0;
}
例:restrict.disasm
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $64, %rsp
.seh_stackalloc 64
.seh_endprologue
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movl $0, -4(%rbp)
movl $0, -8(%rbp)
jmp .L2
.L3:
addl $1, -4(%rbp)
addl $1, -8(%rbp)
.L2:
cmpl $9, -8(%rbp)
jle .L3
movl $0, -12(%rbp)
jmp .L4
.L5:
addl $1, -4(%rbp)
addl $1, -12(%rbp)
.L4:
cmpl $9, -12(%rbp)
jle .L5
movl $0, -16(%rbp)
jmp .L6
.L7:
addl $1, -4(%rbp)
addl $1, -16(%rbp)
.L6:
cmpl $9, -16(%rbp)
jle .L7
movl $0, -20(%rbp)
jmp .L8
.L9:
addl $1, -4(%rbp)
addl $1, -20(%rbp)
.L8:
cmpl $9, -20(%rbp)
jle .L9
movl $0, %eax
addq $64, %rsp
popq %rbp
ret
例:reuse.disasmあなたは、両方の文を混ぜて使用すると、関数内で再利用される一般的なループカウンタ(i、j、k)を宣言して、明示的に重要な意味変数を維持することができます実際には
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movl $0, -8(%rbp)
movl $0, -4(%rbp)
jmp .L2
.L3:
addl $1, -8(%rbp)
addl $1, -4(%rbp)
.L2:
cmpl $9, -4(%rbp)
jle .L3
movl $0, -4(%rbp)
jmp .L4
.L5:
addl $1, -8(%rbp)
addl $1, -4(%rbp)
.L4:
cmpl $9, -4(%rbp)
jle .L5
movl $0, -4(%rbp)
jmp .L6
.L7:
addl $1, -8(%rbp)
addl $1, -4(%rbp)
.L6:
cmpl $9, -4(%rbp)
jle .L7
movl $0, -4(%rbp)
jmp .L8
.L9:
addl $1, -8(%rbp)
addl $1, -4(%rbp)
.L8:
cmpl $9, -4(%rbp)
jle .L9
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
名前がついた。
新しいオブジェクトに新しい名前を使用すると、名前を付けた人のように便利です。 – chux
@chux死者の名前を再利用することはできませんか? :) –
"カウンター"という名前の変数を使っていくつかの場所でカウントするのが理にかなっています。しかし、それはリンゴのポンドのコストを保存するためにそれを使用することは理にかなっていません。 –