Forum: Compiler & IDEs avr-gcc und printf


von Printer (Gast)


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!

von OldMen (Gast)


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.

von Rolf Magnus (Gast)


Lesenswert?

Printer schrieb:
> Hallo zusammen,
>
> kurze, schmerzlose Frage:
> parst avr-gcc beim Kompilieren bereits die Parameterliste von printf()?

Ja.

von Printer (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?


von Printer (Gast)


Lesenswert?

Danke.

von Dirk B. (dirkb2)


Lesenswert?

Printer schrieb:
> void foo(const char *str)
> {
>     printf(str);
> }

Ist auch sehr gefährlich. Wenn ein gültiger Formatspecifier in str ist, 
will printf auch einen Paramter dazu lesen.
Richtig übel kann es bei %s werden.

Wenn dann
1
printf("%s", str);
oder gleich puts/fputs

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Printer schrieb:
> 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.

Ja, gegen fputs(). ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.