zerlegen, zerlegen, zerlegen ...
auf den Codezeilen Je Sie nicht uns zeigen werden, ist es möglich, Wenn Ihr Zeiger etwas statisch ist, wird ein guter Compiler das wissen und die Adresse für beide vorberechnen. Wenn Sie keine Optimierungen haben, ist diese ganze Diskussion stumm. Es hängt auch von dem Prozessor ab, den Sie verwenden, beide können je nach Prozessor mit einem einzigen Befehl ausgeführt werden. Also ich folgen die grundlegenden Optimierungsschritte:
1) zerlegen und untersuchen 2) Zeit, um die Ausführung
Wie oben erwähnt, obwohl das Endergebnis ist, kann es ein Fall von zwei Befehle werden statt einer einen einzigen Takt Kalkulation Zyklus, den Sie wahrscheinlich nie sehen würden. Die Qualität Ihrer Compiler- und Optimizer-Entscheidungen wird deutlich dramatischere Leistungsunterschiede bewirken als der Versuch, eine Codezeile zu optimieren, um die Leistung zu verbessern. Wechselnde Compiler können 10-20% in beide Richtungen geben, manchmal mehr. Wie Sie Ihre Optimierungsflags ändern können, wenn Sie alles einschalten, wird nicht der schnellste Code erstellt, manchmal ist -O1 besser als -O3.
Verstehen, was diese beiden Codezeilen produzieren und wie die Leistung aus der Hochsprache maximiert wird, ergibt sich aus dem Kompilieren für verschiedene Prozessoren und dem Zerlegen mit verschiedenen Compilern. Und noch wichtiger ist, dass der Code um die fraglichen Zeilen eine große Rolle dabei spielt, wie der Compiler dieses Segment optimiert.
Mit jemand anderes Beispiel auf diese Frage:
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
Mit gcc (nicht so toll einen Compiler) erhalten Sie:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
So beide Zeilen C-Code in einem Speicher verbunden ist, Das Problem hier ist das Beispiel, das als Test verwendet wird. Zwei separate Funktionen wären ein wenig besser gewesen, aber es braucht viel mehr Code und der Zeiger muss auf irgendeinen anderen Speicher zeigen, so dass der Optimierer nicht erkennt, dass es eine statische globale Adresse ist. Um dies zu testen, müssen Sie die Adresse übergeben Der Compiler (also gcc) kann also nicht herausfinden, dass es sich um eine statische Adresse handelt.
Oder ohne Optimierungen, gleichen Code, gleichen Compiler, kein Unterschied zwischen Zeiger und direkt.
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
Dies ist, was Sie je nach Compiler und Prozessor erwarten würden, gibt es keinen Unterschied. Für diesen Prozessor würde, selbst wenn der Testcode die statische Adresse für den Zeiger von der Funktion verdeckte, er immer noch auf zwei Befehle herunterkochen. Wenn der Wert, der in dem Strukturelement gespeichert wird, bereits in einem Register geladen ist, dann wäre es ein Befehl, entweder der Zeiger oder direkt.
Also die Antwort auf Ihre Frage ist nicht absolut ...es kommt darauf an. zerlegen und testen.
Was bietet ein Zeiger Ihnen mit diesem direkten Zugriff nicht? Und ein Zeiger ist langsamer. –
-1 für die Frage nach Mikro-Optimierung, ohne es zuerst zu benchmarken. – bk1e