mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unaufgerufende Funktionen


Autor: sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

konsumiert eine Funktion auch Flashplazt, wenn diese definiert aber nie
aufgerufen wird?

Danke
Sommer

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die sollte der Compiler schon wegoptimieren.
Einfach mal ausprobieren:
Die nicht benutze Funktion mitcompilieren und dann das Programm mit
auskommentierter nicht benutzter Funktion compilieren. Es sollte das
gleiche Ergebis (grösse des Compilats) herauskommen. Sonst ist der
Compiler Mist.
Das dürfte allerdings nicht für Interrupt-Service-Routinen gelten.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz so einfach ist die Sache nicht. Wenn die Funktion static ist, dann
ist es kein Problem, weil sie nur von der Übersetzungseinheit, in der
sie definiert ist, aufgerufen werden kann und damit der Compiler
problemlos feststellen kann, ob sie aufgerufen wird. Ist sie nicht
static, dann hat der Compiler keine Wahl - er muß die Funktion liefern,
denn sie könnte ja von einer anderen Übersetzungseinheit aus aufgerufen
werden. Da kann also höchstens noch der Linker einspringen. Beim
GNU-Linker ist es allerdings so, daß er einzelne Funktionen nicht
entfernen kann, sondern nur ganze Übersetzungseinheiten. Wenn also die
Funktion alleine oder nur mit anderen unbenutzten Funktionen zusammen
in einem .c-File steckt, dann wird sie auch entfernt.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber nie aufgerufen

Die Aussage ist doch eindeutig, oder?
"Nie" bedeutet für mich, dass sie auch nicht aus irgendwelchen
Modulen heraus aufgerufen wird. (nur mal etwas "Korinthenkackerei" am
Rande. Also nichts für ungut!)

Ist es nicht aus so, dass Funktionen (z.B. aus der stdio-lib) nur dann
mit verwendet werden, wenn sie auch wirklich gebraucht werden?
Das ist dann aber die Aufgabe des Linkers, oder?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn also die Funktion alleine oder nur mit anderen
> unbenutzten Funktionen zusammen in einem .c-File
> steckt, dann wird sie auch entfernt.

Aber auch nur dann, wenn das aus dem .c-File enstehende .o-File in eine
Bibliothek verpackt und diese dem Linker übergeben wird. Wird das
.o-File direkt dem Linker übergeben, bindet er es auf jeden Fall ein,
auch wenn es nicht benötigt wird. So ist das zumindest beim ld aus den
GNU binutils-2.16.1, der typischerweise zusammen mit GCC verwendet
wird.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der GCC/LD kann nicht benutzte Funktionen entfernen. Dazu verwendet man
die Compilerflags "-ffunction-sections -fdata-sections" und das
Linkerflag "--gc-sections". Beispiel-Makefile:
http://www.mikrocontroller.net/trac/browser/trunk/Makefile

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> "Nie" bedeutet für mich, dass sie auch nicht aus irgendwelchen
> Modulen heraus aufgerufen wird.

Klar. Aber der Compiler weiß das nicht. Er muß annehmen, daß die
Funktion aufgerufen werden könnte, denn während er eine
Übersetzungseinheit bearbeitet, hat er absolut keine Informationen
über die anderen. Deshalb muß er die Funktion mitliefern, auch wenn sie
in Wirklichkeit nicht aufgerufen wird (es sei denn, sie ist static, weil
sie dann gar nicht von woanders aus aufgerufen werden kann).

> Das ist dann aber die Aufgabe des Linkers, oder?

Ja.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas Schwarz:

Danke für den nützlichen Tip mit den sections-Optionen. Schon wieder
was dazugelernt :)

Autor: Sourcecode (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> (es sei denn, sie ist static, weil
> sie dann gar nicht von woanders aus aufgerufen werden kann)

Das ist aber irgendwie auch unlogisch - oder? Eine static Funktion wird 
nur innerhalb einer Funktion in der gleichen Quelle benutzt. Und ob 
diese andere Funktion benutzt wird, ist dann ja wieder unbekannt, sodass 
davon ausgegangen werden muss, dass sie gebraucht wird. (?)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sourcecode schrieb:
> Rolf Magnus schrieb:
>> (es sei denn, sie ist static, weil
>> sie dann gar nicht von woanders aus aufgerufen werden kann)
>
> Das ist aber irgendwie auch unlogisch - oder? Eine static Funktion wird
> nur innerhalb einer Funktion in der gleichen Quelle benutzt.

Es ging um Funktionen, die nicht benutzt werden.
Wird eine static Funktion innerhalb einer Übersetzungseinheit nicht 
benutzt, dann kann sie der Compiler entfernen.

Wie kann so etwas entstehen?
Zb indem man 2 Funktionen wahlweise zur Verfügung stellt und mit einem 
Präprozessor Makro je nach Umfeld die eine oder die andere aufruft.
static void foo1()
{
  ...
}

static void foo2()
{
  ...
}

void bar()
{
#ifdef _MEGA16_
  foo1();
#else
  foo2();
}

Klar könnte man das auch anders lösen, indem man die Funktionen selber 
mit Präprozessoranweisungen auswählt, aber es ging ja um die Frage, wie 
so etwas entstehen KANN.

> Und ob
> diese andere Funktion benutzt wird, ist dann ja wieder unbekannt, sodass
> davon ausgegangen werden muss, dass sie gebraucht wird. (?)

Korrekt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.