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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.