Lunes 16 de Diciembre de 2024, 19:25
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Efiencia con punteros
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Efiencia con punteros (Leído 2880 veces)
Leber
Miembro activo
Mensajes: 65
Efiencia con punteros
«
en:
Miércoles 13 de Abril de 2011, 22:18 »
0
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
Tweet
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Efiencia con punteros
«
Respuesta #1 en:
Jueves 14 de Abril de 2011, 09:25 »
0
Cita de: "Leber"
leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera
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, 4
lw $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.
Fr33k K0mpu73r
Leber
Miembro activo
Mensajes: 65
Re: Efiencia con punteros
«
Respuesta #2 en:
Jueves 14 de Abril de 2011, 09:39 »
0
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
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Efiencia con punteros
«
Respuesta #3 en:
Jueves 14 de Abril de 2011, 09:41 »
0
Sí, yo no he dicho que lo hayas malinterpretado, sino que es mentira.
Saludos!
Fr33k K0mpu73r
Leber
Miembro activo
Mensajes: 65
Re: Efiencia con punteros
«
Respuesta #4 en:
Jueves 14 de Abril de 2011, 09:47 »
0
Supongo que este tipo de dudas solo pueden verse a bajo nivel, viendo el código ensamblador que genera.
m0skit0
Miembro de PLATA
Mensajes: 2337
Nacionalidad:
Re: Efiencia con punteros
«
Respuesta #5 en:
Jueves 14 de Abril de 2011, 11:40 »
0
Sip, y eso es lo que te he mostrado. De todas formas como te digo diferentes compiladores con diferentes opciones de optimización te generarán diferentes ensambladores.
Fr33k K0mpu73r
Amilius
Miembro HIPER activo
Mensajes: 665
Re: Efiencia con punteros
«
Respuesta #6 en:
Jueves 14 de Abril de 2011, 18:46 »
0
El problema de esas pequeñas optimizaciones es que su velocidad depende mucho del contexto (las instrucciones que le preceden y suceden, el estado de la memoria, el estado del caché, etc, etc.). También depende del compilador que uses (que instrucciones genera y si está optimizado para cierto tipo de procesadores), de la arquitectura del procesador y hasta del modelo del procesador. Al final no tienes la certeza si el código será una nada más rápido o una nada más lento, a menos que midas el rendimiento varias veces con una muestra representativa del tipo de datos que serán procesados y saques un promedio para compararlos objetivamente.
Lo que si da resultados, independientes de otros factores, es reducir la complejidad matemática del algoritmo.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Efiencia con punteros