Even een voorbeeldje:
int main() {
int a = 10;
do {
--a;
} while (a > 0);
return 0;
}
genereert deze assembler-code:
.file "test.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $10, -8(%ebp)
.L2:
subl $1, -8(%ebp)
cmpl $0, -8(%ebp)
jg .L2
movl $0, %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
int main() {
int a = 10;
lus:
--a;
if (a > 0) goto lus;
return 0;
}
genereert deze assembler-code:
.file "test.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $10, -8(%ebp)
.L2:
subl $1, -8(%ebp)
cmpl $0, -8(%ebp)
jg .L2
movl $0, %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
Zoals je kan zien (diff zal het je ook weten te vertellen) is de gegenereerde assembler-code exact hetzelfde. Dus goto geeft je in 99% van de gevallen geen enkel voordeel. Ook als je de binaries vergelijkt met diff zal je zien dat ze hetzelfde zijn.