¿Que es más eficiente, utilizar array o memoria dinámica? [C]

Iniciado por NOB2014, 4 Mayo 2016, 20:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Eternal Idol

Cita de: AlbertoBSD en  5 Mayo 2016, 15:35 PM
Supongo que las optimizaciones que se puedan a hacer al codigo en C podrian tener distintos resultados dependiendo de la plataforma y flags del compilador.

Sin duda, la plataforma es fundamental y el compilador tambien tiene lo suyo.

Cita de: AlbertoBSD en  5 Mayo 2016, 15:35 PMLo que comentan sobre si mov usa 3 o 4 bytes podria dejarse para aplicaciones muy especializadas  donde cada ciclo del procesador cuente.

Para PC es poco relevante segun mi opinion, en sistema embebidos - donde hay que ahorrar bateria muchas veces - es otra cosa.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

NOB2014

Hola.

CitarAun.que creo que la pregunta era mas orientada a alguien que apenas esta aprendiendo a user apuntadores.

Si bien esto es totalmente correcto, me parece interesante el debate porque a este post es probable que lo lean
gente que sepan mucho pero no tanto como vos, Eternal, MAFUS,  class_OpenGL, ivancea96, etc. -
Igual para mi todo esto es chino basico, algo seguramente voy a rescatar. -

Adelane y un abrazo.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS

#12
Sí, cada compilador genera su propio código y en verdad no se puede asegurar que uno u otro optimice más.
Por ejemplo GCC con O2 no genera ni el array en el ejemplo del array en pila de Eternal Idol:
Código (asm) [Seleccionar]

main:
.LFB24:
.cfi_startproc
sub rsp, 8
.cfi_def_cfa_offset 16
mov edx, 2
mov esi, OFFSET FLAT:.LC0
mov edi, 1
xor eax, eax
call __printf_chk
xor eax, eax
add rsp, 8
.cfi_def_cfa_offset 8
ret
.cfi_endproc





Todo depende de cada compilador y de la configuración que se le da. Continuar ahora sería entrar en una guerra de compiladores, jeje, y no es plan.

Eternal Idol

Idem /O2 para VC++, aunque claro eso no sirve en lo absoluto para comparar el acceso a arrays:

Código (asm) [Seleccionar]
main:
  0000000000000000: 48 83 EC 28        sub         rsp,28h
  0000000000000004: 48 8D 0D 00 00 00  00 lea         rcx,[??_C@_02IKAHHCAI@?$CFi?$AA@]
  000000000000000B: BA 02 00 00 00     mov         edx,2
  0000000000000010: E8 00 00 00 00     call        printf
  0000000000000015: 33 C0              xor         eax,eax
  0000000000000017: 48 83 C4 28        add         rsp,28h
  000000000000001B: C3                 ret


Por cierto con un ligero cambio se podria forzar el uso del array haciendo que en tiempo de compilacion no se sepa el valor a imprimir:
Código (cpp) [Seleccionar]
array[x] =  rand() % 256 + 1;

Pero visto lo visto no tiene sentido el debate cuando se pasan de largo los argumentos.




En definitiva depende de la plataforma en primer lugar y como vimos en PC no es mas o menos eficiente usar un array en la pila o en el monticulo en cuanto a acceso al mismo (ambos son memoria virtual que el S.O. se encarga de mappear a RAM con ayuda del hardware y se usan las mismas instrucciones mov para acceder), otra cosa es la reserva/liberacion.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón