desmontar, desarmar, desmontar ...
En función de las líneas de código que no nos muestran que es posible que si su puntero es algo estático, un buen compilador lo sabrá y precalculará la dirección para ambos. Si no tiene optimizaciones, entonces toda esta discusión es muda. También depende del procesador que esté utilizando, ambos se pueden realizar con una sola instrucción dependiendo del procesador. Así que sigo los pasos básicos de optimización:
1) Desmontar y examinar 2) tiempo de la ejecución
Como se mencionó anteriormente, aunque la conclusión es que puede ser un caso de dos instrucciones en lugar de uno que cuesta un solo reloj ciclo que probablemente nunca verás La calidad de las elecciones de compilador y optimizador supondrá diferencias de rendimiento mucho más dramáticas que tratar de ajustar una línea de código con la esperanza de mejorar el rendimiento. El cambio de compiladores puede proporcionarle un 10-20% en cualquier dirección, a veces más. Al igual que cambiar los indicadores de optimización, encender todo no es el código más rápido, a veces -O1 tiene un mejor rendimiento que -O3.
Entender qué producen esas dos líneas de código y cómo maximizar el rendimiento del lenguaje de alto nivel proviene de compilar para diferentes procesadores y desmontar utilizando varios compiladores. Y más importante aún, el código alrededor de las líneas en cuestión juega un papel importante en la forma en que el compilador optimiza ese segmento.
El uso de otro ejemplo de esta pregunta:
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
con gcc (no es para tanto un compilador) se obtiene:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
Así que ambas líneas de código C se unen en una tienda, el problema aquí es el ejemplo utilizado como prueba. Dos funciones separadas habrían sido un poco mejores, pero necesita un código mucho mayor y el puntero necesita apuntar a otra memoria para que el optimizador no se dé cuenta de que es una dirección global estática, para probar esto debe pasar la dirección en entonces el compilador (bueno gcc) no puede entender que es una dirección estática.
O sin optimizaciones, mismo código, mismo compilador, sin diferencia entre puntero y directo.
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
Esto es lo que esperaría ver según el compilador y el procesador, puede que no haya diferencia. Para este procesador, incluso si el código de prueba ocultara la dirección estática del puntero de la función, se reduciría a dos instrucciones. Si el valor almacenado en el elemento de estructura ya estaba cargado en un registro, entonces sería una instrucción en ambos sentidos, puntero o directo.
Así que la respuesta a su pregunta no es absoluta ...depende. desmontar y probar.
¿Qué le proporciona un puntero que no tiene acceso directo? Y un puntero es más lento. –
-1 para preguntar acerca de la micro-optimización sin compararla primero. – bk1e