Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[optymalizacje, C++] Operator warunkowy VS instrukcja if

Ostatnio zmodyfikowano 2012-01-23 14:29
Autor Wiadomość
akwes
Temat założony przez niniejszego użytkownika
[optymalizacje, C++] Operator warunkowy VS instrukcja if
» 2012-01-22 17:09:53
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

C/C++
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

C/C++
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

C/C++
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
C/C++
apr_table_set( r->headers_in, "Max-Forwards", apr_psprintf( r->pool, "%ld",( maxfwd > 0 ) ? maxfwd
    : 0 ) );
zamiast
C/C++
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 ) );

P-49130
pekfos
» 2012-01-22 17:28:51
C/C++
tom =( ala > 10 ) ? true
    : false;
A pomyślałeś o
tom = ala > 10;
:P
P-49134
akwes
Temat założony przez niniejszego użytkownika
» 2012-01-22 17:29:54
Dobra ;p dla true i false zadziała, ale dla intów 5 i 6 juz nie, a wyrażenie warunkowe tak :P
P-49135
pekfos
» 2012-01-22 17:58:44
Przepraszam, ale muszę:
C/C++
#include <cstdio>
//dla uproszczenia:
#define T(a) printf("%d", (a))

int main() {
    int ala = 11;
    T( !( ala > 10 ) + 5 );
    ala = 8;
    T( !( ala > 10 ) + 5 );
}
:P
P-49138
RazzorFlame
» 2012-01-22 18:03:57
Sory za offtopa ale gdzie wy patrzycie jak wygląda kod asma?
P-49140
m4tx
» 2012-01-22 18:20:00
@RazzorFlame
g++ -S lol.cpp -o lol.asm
P-49143
akwes
Temat założony przez niniejszego użytkownika
» 2012-01-22 18:44:10
@pekfos

i nagle się robi 52 linie asma i 5 skoków

chyba nie o to chodzi :P



.file "ala2.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d\0"
.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, -16(%ebp)
movl -16(%ebp), %eax
call __alloca
call ___main
movl $11, -4(%ebp)
cmpl $10, -4(%ebp)
jg L2
movl $6, -8(%ebp)
jmp L3
L2:
movl $5, -8(%ebp)
L3:
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $8, -4(%ebp)
cmpl $10, -4(%ebp)
jg L4
movl $6, -12(%ebp)
jmp L5
L4:
movl $5, -12(%ebp)
L5:
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
.def _printf; .scl 2; .type 32; .endef

P-49145
pekfos
» 2012-01-22 18:55:04
Wywaliłeś te printfy? :P
P-49147
« 1 » 2 3 4
  Strona 1 z 4 Następna strona