Byłem ciekaw czy opłaca się używać operatora warunkowego przy małych ifach, bo do tej pory używałem go rzadko.
Zwykły IF
int main()
{
int ala = 11;
int tom;
if( ala > 10 )
{
tom = true;
}
else
{
tom = false;
}
return 0;
}
.file "ala.cpp"
.def ___main; .scl 2; .type 32; .endef
.text
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $11, -4(%ebp)
cmpl $10, -4(%ebp)
jle L2
movl $1, -8(%ebp)
jmp L3
L2:
movl $0, -8(%ebp)
L3:
movl $0, %eax
leave
ret
Linii:
31
Krótki IF
int main()
{
int ala = 11;
int tom;
tom = false;
if( ala > 10 )
{
tom = true;
}
return 0;
}
.file "ala.cpp"
.def ___main; .scl 2; .type 32; .endef
.text
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $11, -4(%ebp)
movl $0, -8(%ebp)
cmpl $10, -4(%ebp)
jle L2
movl $1, -8(%ebp)
L2:
movl $0, %eax
leave
ret
Linii:
29
Wyrażenie warunkowe
int main()
{
int ala = 11;
int tom;
tom =( ala > 10 ) ? true
: false;
return 0;
}
.file "ala2.cpp"
.def ___main; .scl 2; .type 32; .endef
.text
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $10, -4(%ebp)
cmpl $10, -4(%ebp)
setg %al
movzbl %al, %eax
movl %eax, -8(%ebp)
movl $0, %eax
leave
ret
Linii:
28
Operator warunkowy zlikwidował skoki.
Wiem że to pierdoła, ale jestem ciekaw czy faktycznie należy szukać sposobności do użycia operatora zamiast if?
Przykład w z wiki jest również ciekawy
apr_table_set( r->headers_in, "Max-Forwards", apr_psprintf( r->pool, "%ld",( maxfwd > 0 ) ? maxfwd
: 0 ) );
zamiast
if( maxfwd > 0 )
apr_table_set( r->headers_in, "Max-Forwards", apr_psprintf( r->pool, "%ld", maxfwd ) );
else
apr_table_set( r->headers_in, "Max-Forwards", apr_psprintf( r->pool, "%ld", 0 ) );