avr-gcc und printf

Gast #3465848
Lesenswert?

Hallo zusammen,

kurze, schmerzlose Frage:
parst avr-gcc beim Kompilieren bereits die Parameterliste von printf()?

Hintergrund:
1
void foo(const char *str)
2
{
3
    printf(str);
4
}
erzeugt ein bei weitem größeres Kompilat als:
1
void foo(const char *str)
2
{
3
    printf("Hallo");
4
}

Grüße und guten Rutsch schonmal!
Gast #3465866
Lesenswert?

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.
Gast #3465889
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren