Forum: Compiler & IDEs C-Code Optimiert!


von tc11 (Gast)


Lesenswert?

Moin zusammen,

Ich habe mal eine generelle Frage zu einem C-Code. Folgendes ich hab 
eigentlich immer gedacht das wenn ich meinen µC programmiere das ich 
Zeit Spare wenn ich Funktionen Nutze.

Ich habe mir mal den Speicherplatz verbrauch bei einem Mini-Programm 
angeschaut so wie das hier
[c]
Main(void)
{
   _delay_ms(100);
}
[/c)

bei diesem code wird ein bestimmter platz gebraucht.
Wenn man nun folgendes schreibt
[c]
Main(void)
{
   _delay_ms(100);
   _delay_ms(100);
   _delay_ms(100);
}
[/c)

Dann wird 3mal soviel Speichplatz gebraucht so als wenn du Funktion 
einfach nur den Text aus der jeweiligen datei kopiert und dort einfügt.

Ist das echt so gewollt?

Ich hatte eigentlich vermutet das wenn man eine funktion benutzt das 
diese dann EINMALIG im Speicher abgelegt wird und das dann immer nur 
dort hingesprungen wird.

Hab ich da einfach nur was falsch verstanden ?

Gruß
Tee Cee

von Sebastian B. (sebastian86)


Lesenswert?

Huch ich glaube da hast du dich im Forum vertan(wie schreibt man das ?!) 
^^

Könnte das bitte jmd verschieben danke.


Gruß

Sebastian

von Stefan E. (sternst)


Lesenswert?

tc11 wrote:

> Folgendes ich hab
> eigentlich immer gedacht das wenn ich meinen µC programmiere das ich
> Zeit Spare wenn ich Funktionen Nutze.

Nein, du sparst Platz, keine Zeit (im Sinne von "Ausführungszeit").

> Dann wird 3mal soviel Speichplatz gebraucht so als wenn du Funktion
> einfach nur den Text aus der jeweiligen datei kopiert und dort einfügt.
>
> Ist das echt so gewollt?

Ja, denn _delay_ms ist eine Inline-Funktion.

> Ich hatte eigentlich vermutet das wenn man eine funktion benutzt das
> diese dann EINMALIG im Speicher abgelegt wird und das dann immer nur
> dort hingesprungen wird.

Bei "normalen" Funktionen ist das auch so.

von yalu (Gast)


Lesenswert?

Die Delay-Funktionen sind aus folgenden Gründen inline:

- Nur wenn die Funktionen inline sind, kann der Compiler die ziemlich
  aufwendige Umrechnung von Millisekunden in Schleifendurchläufe
  während des Kompilierens durchführen. Sonst müsste das zur Laufzeit
  passieren, was Zeit kostet und die Funktion sehr stark aufblähen
  würde.

- Die Funktionen sind kurz (3 Worte mit dem Laden des Argument-
  registers). Ein Aufruf als Unterprogramm braucht 2 bis 3 Worte (je
  nachdem, ob RCALL ausreicht oder CALL benutzt werden muss). Man
  würde also also nur 0 bis 1 Worte pro Aufruf einsparen.

- So wie die Funktionenen implementiert sind, ensteht keinerlei
  Aufruf-Overhead, nicht einmal durch das Laden des Argumentregisters,
  da der dafür benötigte Prozessorzyklus beim Verlassen der Schleife
  durch den dann nicht verzweigenden BRNE-Befehl kompensiert wird.
  Als Unterprogramm kommen durch die CALL-/RCALL- und RET-Befehle 7
  bis 10 Zyklen Overhead dazu, was bei einer Zeitauflösung von 3
  (_delay_us) bzw. 4 (_delay_ms) Zyklen schon etwas stört.

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.