OldMen schrieb:
> Ist doch klar warum, oder?
> Im zweiten Fall braucht der Compiler weniger zu tun, da der String, das
> "Hallo", fest im Data-Bereich abgelegt werden kann.
> Wenn der Pointer str übergeben wird, muss logischer Weise mehr Code
> generiert werden, da mehr Maschinenoperationen notwendig sind, um den
> Pointer zu übergeben. Register, Stack, usw. vorbereiten.
> Lass Dir doch mal das ASM-Listing ausgeben, dann siehst Du den
> Unterschied direkt.
So klar ist das nicht.
printf() ist eine Funktion mit fest definierter Schnittstelle, nämlich
1 | extern int printf(const char *__fmt, ...);
|
D.h. der Compiler hat, wenn er den Funktionsaufruf umsetzt, genau eine
Möglichkeit: er muss ihr einen Zeiger als erstes Argument übergeben.
Wohin dieser Zeiger denn zeigt oder ob er wiederum selbst Argument einer
Funktion ist wie in Beispiel 1) dürfte keine Rolle spielen - printf()
kriegt einen Zeiger übergeben, fertig.
Meine Vermutung war, gcc parst den Formatstring bereits selbst und linkt
dann gegen eine abgespeckte Version von printf(), die z.B. keine
Zahlenkonvertierung können muss.
Finde ich logischer als deine Antwort.