smontare, smontare, smontare ...
A seconda delle linee di codice non si sta mostrando noi è possibile che se il tuo puntatore è statico un buon compilatore lo saprà e pre-calcolerà l'indirizzo per entrambi. Se non ci sono ottimizzazioni allora tutta questa discussione è muta. Dipende anche dal processore che si sta utilizzando, entrambi possono essere eseguiti con una singola istruzione a seconda del processore. Così ho seguito le fasi di ottimizzazione di base:
1) smontare ed esaminare 2) tempo di esecuzione
Come accennato in precedenza anche se la linea di fondo è che può essere un caso di due istruzioni invece di uno che costa un singolo orologio ciclo che probabilmente non vedresti mai. La qualità delle scelte del compilatore e dell'ottimizzatore produrrà differenze di prestazioni molto più drammatiche rispetto al tentativo di modificare una riga di codice nella speranza di migliorare le prestazioni. Il cambio di compilatore può darti il 10-20% in entrambe le direzioni, a volte di più. Come può cambiare i tuoi flag di ottimizzazione, l'attivazione di tutto non fa il codice più veloce, a volte -O1 si comporta meglio di -O3.
Comprendere cosa producono queste due righe di codice e come ottimizzare le prestazioni dal linguaggio di alto livello deriva dalla compilazione per diversi processori e dal disassemblaggio utilizzando vari compilatori. E ancora più importante il codice attorno alle linee in questione gioca un ruolo importante nel modo in cui il compilatore ottimizza quel segmento.
Utilizzando esempio di qualcun altro su questa questione:
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 (non un gran che un compilatore) si ottiene:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
Così entrambe le righe di codice C sono uniti in un unico archivio, il problema qui è l'esempio usato come test. Due funzioni separate sarebbero andate un po 'meglio ma ha bisogno di molto più codice attorno ad esso e il puntatore deve puntare ad un'altra memoria in modo che l'ottimizzatore non si accorga che è un indirizzo globale statico, per testare questo è necessario passare l'indirizzo in quindi il compilatore (bene gcc) non riesce a capire che si tratta di un indirizzo statico.
O senza ottimizzazioni, stesso codice, stesso compilatore, nessuna differenza tra puntatore e diretto.
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
Questo è ciò che ci si aspetterebbe di vedere a seconda del compilatore e del processore, potrebbe non esserci differenza. Per questo processore, anche se il codice di test nascondesse l'indirizzo statico del puntatore dalla funzione, sarebbe comunque ridotto a due istruzioni. Se il valore memorizzato nell'elemento della struttura fosse già stato caricato in un registro, sarebbe un'istruzione in entrambi i casi, puntatore o diretto.
Quindi la risposta alla tua domanda non è assoluta ...dipende. smontare e testare.
Che cosa fornisce un puntatore a quell'accesso diretto no? E un puntatore è più lento. –
-1 per chiedere informazioni sulla micro-ottimizzazione senza prima averla analizzata. – bk1e