Programación General > C/C++

 Efiencia con punteros

(1/2) > >>

Leber:
Hola, quizás el titulo no es muy descriptivo. Intentare explicarme:

Supongamos un array como este:


--- Código: C ---int enteros[2] = {4 ,5 }; 
Para acceder a su contenido puede hacerse:


--- Código: C ---enteros[1] 
o


--- Código: C ---*(enteros + 1) 
La segunda forma, por lo que he podido comprobar, toma la dirección en la que empieza la variable enteros, y dado que un entero ocupa 4 bytes, le suma 4 a la direccion base para así obtener el contenido del segundo indice.

Sería algo como: 0x7fff00a49620(dirección del primer indice de enteros) + 4. Creo que no me equivoco, es así, no?

Ahora bien, leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera.  Y mi pregunta es, de que forma esta accediendo con enteros[1] para que sea menos rápido ?

Gracias de antemano

m0skit0:

--- Cita de: "Leber" ---leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera
--- Fin de la cita ---
No sé dónde viste eso, pero es mentira. Creo que ya te comenté anteriormente en otro hilo que un puntero y un array en C es lo mismo (salvo que el array ya tiene reservada la memoria automáticamente).

En un array se puede usar direccionamiento indexado si la arquitectura objetivo soporta dicho modo de direccionamiento de memoria (que son casi todas). Por ejemplo en arquitectura MIPS (que es la más reciente que tengo en mente) para enteros[1] podrías direccionarlo como 4($t0) siendo el registro $t0 la dirección del puntero enteros. Por tanto estás accediendo directamente al elemento con una única instrucción:


--- Código: Text ---lw $t1, 4($t0) con esto cargo directamente enteros[1] en un registro. En caso de hacerlo con un puntero como dices, serían 2 instrucciones:


--- Código: Text ---add $t0, $t0, 4lw $t1, 0($t0) Por tanto en el caso que tú planteas el array es el más rápido y no el puntero.

De todas formas todo esto depende del compilador, de sus opciones de optimización y de la arquitectura para la que se compila, ya que ambos escenarios son posibles. En cualquier caso la diferencia de velocidad es mínima.

Leber:
Si, se que es lo mismo, y no, no fue a mi pero vi que se lo comentabas a alguien, pero no me refería a esto como si fueran dos tipos distintos, si no la manera de acceder a ellos, aunque ya lo has explicado.

Esto lo vi en una web donde explicaban un poco sobre punteros.

"Sin embargo, hay que tener en cuenta que la forma *(x+i) es mucho más eficiente que x, por lo que suele preferirse cuando la velocidad del ejecución es un factor determinante."

Quizá soy yo que lo he malinterpretado, pero creo que se refiere a lo que he dicho.

gracias  ^_^

m0skit0:
Sí, yo no he dicho que lo hayas malinterpretado, sino que es mentira.

Saludos!

Leber:
Supongo que este tipo de dudas solo pueden verse a bajo nivel, viendo el código ensamblador que genera.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa