-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: INLINE nicht eindeutig

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521

    INLINE nicht eindeutig

    Anzeige

    Hallo zusammen, zum Wochenende eine kleine Frage:

    Ich wollte meiner Software etwas unter die Arme greifen und unnötige Funktionsaufrufe vermeiden.
    Also ein Speedup sozusagen.

    Nun dachte ich (sollte man nicht, weis ich) durch das Schlüsselwort "inline" wird der Funktionscode
    jeweils direkt eingesetzt ohne Funktionsaufruf. Das macht den Code zwar größer aber call und return entfallen.

    Nun lese ich grad Folgendes und muss feststellen das ich durch inline NICHT unbedingt zum gewünschten Ziel komme

    Quelle: https://de.wikibooks.org/wiki/C-Prog...ine-Funktionen

    a) Eine Funktion, die als inline definiert ist, soll gemäß dem C-Standard so schnell wie möglich aufgerufen werden.
    b) Die genaue Umsetzung ist der Implementierung überlassen.
    c) Beispielsweise kann der Funktionsaufruf dadurch beschleunigt werden, dass die Funktion nicht mehr als eigenständiger Code vorliegt,
    sondern an der Stelle des Funktionsaufrufs eingefügt wird.
    Dadurch entfällt eine Sprunganweisung in die Funktion und wieder zurück.
    d) Allerdings muss der Compiler das Schlüsselwort inline nicht beachten,
    wenn der Compiler keinen Optimierungsbedarf feststellt.
    f) Viele Compiler ignorieren deshalb dieses Schlüsselwort vollständig und setzen auf Heuristiken, wann eine Funktion inline sein sollte.


    zu a) eigentlich soll die Funktion garnicht aufgerufen werden, sondern der Code direkt eingefügt werden.
    zu b) verstehe ich nicht, die Implementierung ist doch mein code ?
    zu c) genau das möchte ich
    zu d) UPPS, das soll er aber unbedingt beachten, unabhängig von der Optimierungsstufe
    zu f) damit ist inline für mich unsinnig geworden


    Gibt es einen Zwangs-Paramter(Schlüsselwort), dass der Code "unbedingt" ohne Aufruf in den Code eingetragen wird ?

    Ich danke Euch schonmal für Informationen

    Siro

    - - - Aktualisiert - - -

    Habe noch etwas weiter gesucht und folgendes gefunden:

    Inline Methoden

    In der klassenorientierten Programmierung kommt es häufig vor, dass eine Methode nur aus einer einzigen Anweisung besteht. Dies geschieht besonders oft bei sogenannten Gettern. Hierbei ist der Aufwand, die Funktion zu rufen aufwendiger als das, was die Funktion eigentlich leistet.
    In dem Fall kann man dem Compiler empfehlen, den Funktionsaufruf wegzulassen und die wenigen Anweisungen direkt da auszuführen, wo eigentlich die Funktion gerufen werden soll.
    Eine inline-Funktion wird also überall da eingesetzt, wo eigentlich die Funktion gerufen werden sollte.

    Also ist inline nur eine Compiler Empfehlung. Man kann es nicht direkt steuern
    Geändert von Siro (15.01.2016 um 10:53 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Hey,
    zu a) Von Wikipedia:
    Es ist für den Compiler aber nicht für jede beliebig komplizierte Funktion möglich, die vom Programmierer gewünschte Ersetzung auch durchzuführen. Dann wird der normale Funktionsaufruf beibehalten.
    Aus dem englischen Artikel: [quote]Complete inline expansion is not always possible, due to recursion: recursively inline expanding the calls will not terminate. [/qoute]
    zu b) Nein die Implementierung des Standards macht der Compilerhersteller.
    zu c) Von Wikipedia: [quote]Vielmehr ist das inline im Beispiel als Empfehlung an den Compiler zu sehen, der er aber nicht nachgehen muss[/qoute]
    zu d) 1. Nein wenn die auf Size Optimierst dann wäre es für den Compiler ja falsch das zu machen. 2. Es gibt compiler spezifische Erweiterungen wie __forceinline die inline erzwingen
    zu f) Der Compiler weis in der Regel besser zu Optimieren als du.

    Lies dir mal den englischen Artikel dazu durch: https://en.wikipedia.org/wiki/Inline_expansion da wird das sehr genau beschrieben.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    521
    Ich danke Dir shedepe

    Ich hab es mir grad durchgelesen und habe die Komplexität von inline völlig unterschätzt.
    Je nach Code kann das echt problematisch werden für den Compiler. Wenn dann noch Paramter oder schlimmer Rekursionen auftreten, sollte man das lieber dem Compiler überlassen wie und ob er dort optimiert,
    gebe ich Dir bzw. dem Compiler völlig recht.

    Ich hatte nur eine Minifunktion die zwei Werte subtrahiert und wollte den Compiler dazu zwingen den Code als inline zu codieren.
    Das tut er vermutlich sogar selbst wenn ich die entsprechenden Optimierungen setze.

    Dann sind wird von meiner Seite schon durch mit dem Thema INLINE
    und wünsche ein "optimales" Wochenende.
    Siro

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    Mit
    Code:
    static inline void Fahrmotorencheck(void)__attribute__((always_inline));
    schaffe ich es das diese Funktion immer inline ist.

    Mache das aber nur für kleine in sich geschlossene Funktionen die oft aufgerufen werden.

    Habe mal gelesen das es bei den Atmegas nicht so darauf ankommt da Funktionsaufrufe schnell abgearbeitet werden.
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Kleiner Tipp zum Thema Optimierung (von Hand):
    Optimierung sollte man erst dann verwenden wenn man sie braucht. Wenn dein Programm das tut was es soll, und das schnell genug dann ist das gut so. In dem fall sollte man lieber auf sauberen, wartbaren Code achten.
    Wenn man aber tatsächlich ein Performance Problem hat, dann sollte man seinen Code profilen. Z.B. mit Callgrind auf Linux. Ein Profiler zeigt dir an wie häuft ein bestimmter Funktionsaufruf gemacht wird.
    Dann kann dort gezielt optimieren. Es bringt z.B. nichts eine Routine die nur einmal oder zwei mal aufgerufen wird zu optimieren. Wenn man hingegen eine Routine die alle 5ms aufgerufen wird, kann man viel mehr rausholen.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Siro,
    Zitat Zitat von Siro Beitrag anzeigen
    Ich hatte nur eine Minifunktion die zwei Werte subtrahiert und wollte den Compiler dazu zwingen den Code als inline zu codieren.
    So etwas kann man als Macro realisieren:

    #define add(a,b) (a)+(b);

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Bevor man Macro anstelle von inline Funktionen vorschlägt sollte man sich Gedanken drüber machen ob Macros wirklich Sinn machen.
    Das ist die erste Zusammenfassung die ich auf die Schnelle gefunden habe:

    https://stackoverflow.com/questions/...ocessor-macros

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von shedepe Beitrag anzeigen
    Bevor man Macro anstelle von inline Funktionen vorschlägt sollte man sich Gedanken drüber machen ob Macros wirklich Sinn machen.
    Wenn man garantiert haben will, dass der Code auch wirklich inline eingefügt wird, geht das nur mit Macros.
    Inline ist, wie vieles in C, nur eine Empfehlung an den Compiler.

    Übrigens wurde inline erst mit C++ eingeführt und wurde dann in C99 übernommen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    @Peter: Das stimmt so nicht. Wenn du dir den Thread noch mal durchliest, dann kann man tatsächlich den Compiler auch zu einem inline zwingen. Nur ist das eben compilerspezifisch und nicht im C/C++ Standard festgelegt.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Microsoft hat nen ganz interessanten weiterführenden Artikel zum Thema "inline" verfasst.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Bascom Inline-Assembler
    Von Che Guevara im Forum Assembler-Programmierung
    Antworten: 64
    Letzter Beitrag: 07.02.2012, 20:00
  2. "gicr" wird im inline-code für den 644p nicht erka
    Von funkheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 08.02.2011, 19:15
  3. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 20:25
  4. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 17:39
  5. Inline Asm Rückgabe
    Von FoCus im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 09.02.2006, 11:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •