Nachteile von Inline-Funktion

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Nachteile von Inline-Funktion

Beitrag von Glocke » Do Feb 14, 2013 9:16 am

Hey,

ich bin vorhin über Inline-Funktionen gestolpert. Die Vorteile sind mir bewusst; ebenso, dass ich eine rekursive Funktion nicht als Inline-Funktioni implementieren kann. Nur frage ich mich, wo die Nachteile liegen? Sind die Nachteile, dass meine Header-Datei größer wird, wenn ich exzessiv inline-Funktionen/-Methoden verwende? Oder wird das Programm schwieriger zu debuggen?

Mit dem was ich bisher gelesen habe, wirken inline-Funktionen wie eine eierlegende Wollmilchsau.... :lol:

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Nachteile von Inline-Funktion

Beitrag von Xin » Do Feb 14, 2013 10:55 am

Glocke hat geschrieben:ich bin vorhin über Inline-Funktionen gestolpert. Die Vorteile sind mir bewusst; ebenso, dass ich eine rekursive Funktion nicht als Inline-Funktioni implementieren kann. Nur frage ich mich, wo die Nachteile liegen? Sind die Nachteile, dass meine Header-Datei größer wird, wenn ich exzessiv inline-Funktionen/-Methoden verwende? Oder wird das Programm schwieriger zu debuggen?

Mit dem was ich bisher gelesen habe, wirken inline-Funktionen wie eine eierlegende Wollmilchsau.... :lol:
Inline ist eine freundliche Bitte an den Compiler, doch bitte den Funktionsaufruf gar nicht erst zu implementieren und dafür die Funktion an die Stelle zu packen.

Damit wird das Programm schneller, weil es die Funktion nicht rufen muss. Dafür wird es größer, weil die Funktion redundant an vielen Stellen des Programms liegt. Die Redundanz ist hier kein Problem, da der Compiler sie generiert und sich dabei (vermutlich) nicht vertut. Bei sehr kleinen Funktionen (getMemberVar{ return MemberVar; }) ist das sinnvoll und kürzer als die Funktion überhaupt zu rufen. Bei sehr großen Funktionen, wird das Programm vergrößert.
Was jetzt wichtiger ist, musst Du entscheiden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lirrec
Beiträge: 15
Registriert: Mo Feb 20, 2012 11:55 am

Re: Nachteile von Inline-Funktion

Beitrag von Lirrec » Do Feb 14, 2013 11:03 am

Der Hauptnachteil ist wohl die Größe des resultierenden Programms.
Es könnte zum Beispiel passieren, dass ein Programm mit einer Version einer Funktion noch in den CPU-Cache passt, mit 1000 inline Versionen nicht mehr.

Mit Debuggen hab ich in der Hinsicht keine Erfahrung, aber in der Theorie gehen natürlich beim kompilieren alle Informationen darüber, dass gerade eine inline Funktion läuft, verloren. Bei einem optimierten Programm könnte das also durchaus problematisch werden.
Wenn mit debug-flags kompiliert wird, werden in der Regel auch viele Optmierungen abgeschaltet, deshalb könnten in dem Fall die inline Funktionen vielleicht garnicht als inline kompiliert werden.

Meiner Meinung nach ist das gezielte Verwenden von inline Funktionen durch den Programmierer ( z.B. über das inline-keyword in C++) nicht immer nützlich, die meisten Compiler nehmen inline eher als Hinweis als als Anweisung. In der Regel wird der Compiler zu große oder komplexe Funktionen einfach nicht inlinen, kleine ohne inline-keyword dafür durchaus automatisch.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Nachteile von Inline-Funktion

Beitrag von Xin » Do Feb 14, 2013 11:16 am

Lirrec hat geschrieben:Meiner Meinung nach ist das gezielte Verwenden von inline Funktionen durch den Programmierer ( z.B. über das inline-keyword in C++) nicht immer nützlich, die meisten Compiler nehmen inline eher als Hinweis als als Anweisung.
Müssen Sie - spätestens sobald eine Funktion rekursiv benutzt wird, ist inline hinfällig.

Kaum ein Jahr angemeldet, schon der erste Beitrag ;-)
Bevor wir den Spamschutz hatten, habe ich unbeteiligte User nach drei Monaten gelöscht. Dann war's ja mal gut, dass ich das in der letzten Zeit eingestellt habe.

Willkommen an Board. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Nachteile von Inline-Funktion

Beitrag von Glocke » Do Feb 14, 2013 11:27 am

Lirrec hat geschrieben:Der Hauptnachteil ist wohl die Größe des resultierenden Programms.
Es könnte zum Beispiel passieren, dass ein Programm mit einer Version einer Funktion noch in den CPU-Cache passt, mit 1000 inline Versionen nicht mehr.
Das wäre durchaus ein Nachteil :D
Lirrec hat geschrieben:Mit Debuggen hab ich in der Hinsicht keine Erfahrung, aber in der Theorie gehen natürlich beim kompilieren alle Informationen darüber, dass gerade eine inline Funktion läuft, verloren.
Die Information, dass gerade eine inline-Funktion läuft? Was meinst du damit genau?
Der Compiler setzt den Code von inline-Funktionen doch direkt an Stelle der Funktion ein.... oder hab ich das falsch verstanden?
Lirrec hat geschrieben:Bei einem optimierten Programm könnte das also durchaus problematisch werden.
Naja aber ein optimiertes Programm würde ich eh nicht debuggen wollen - also nicht freiwillig :lol:
Lirrec hat geschrieben:Meiner Meinung nach ist das gezielte Verwenden von inline Funktionen durch den Programmierer ( z.B. über das inline-keyword in C++) nicht immer nützlich, die meisten Compiler nehmen inline eher als Hinweis als als Anweisung.
Xin hat geschrieben:Inline ist eine freundliche Bitte an den Compiler, doch bitte den Funktionsaufruf gar nicht erst zu implementieren und dafür die Funktion an die Stelle zu packen.
Okay, also ein Hinweis :) Ist es nun sinnvoll inline zu verwenden... oder
Lirrec hat geschrieben:In der Regel wird der Compiler zu große oder komplexe Funktionen einfach nicht inlinen, kleine ohne inline-keyword dafür durchaus automatisch.
... oder macht das der Compiler beim optimieren selbständig?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Nachteile von Inline-Funktion

Beitrag von Xin » Do Feb 14, 2013 11:37 am

Glocke hat geschrieben:
Lirrec hat geschrieben:Mit Debuggen hab ich in der Hinsicht keine Erfahrung, aber in der Theorie gehen natürlich beim kompilieren alle Informationen darüber, dass gerade eine inline Funktion läuft, verloren.
Die Information, dass gerade eine inline-Funktion läuft? Was meinst du damit genau?
Der Compiler setzt den Code von inline-Funktionen doch direkt an Stelle der Funktion ein.... oder hab ich das falsch verstanden?
Eine Debug-Version hat deutlich mehr Informationen über den Programmverlauf, hier kann der komplette Quelltext einkompiliert sein, also auch die Information, woraus die folgenden Assemblerbefehle erzeugt wurden und wo sie im Quelltext stehen.

So springt Dein Debugger an die richtige Zeile im Code, aber im eigentlichen Programm fehlt der Sprung.
Debug-Versionen sind in der Regel nicht optimiert. Hier kann 'inline' also sowieso ignoriert werden.
Glocke hat geschrieben:Okay, also ein Hinweis :) Ist es nun sinnvoll inline zu verwenden... oder
... oder macht das der Compiler beim optimieren selbständig?
Du drückst Deine persönliche Präferenz aus. Der Compiler wägt dann ab, ob er das genauso sieht. So kann er Funktionen inline setzen, die Du nicht als inline deklariert hast oder das inline verwerfen (z.B. weil es durch Rekursion nicht umsetzbar ist). Inline dient dazu, größere Funktionen inline zu verarbeiten, die der Compiler dafür jetzt nicht ausgewählt hätte. Compiler, die inline-Funktionen nicht beherrschen, ignorieren es sowieso.

Nutze inline, wenn Du eine Funktion inline halten möchtest. Das kann zum Beispiel auch bei größeren Funktionen sinnvoll sein, die z.B. den Körper eine Schleife beschreiben, wo der Schleifenkörper also nur ausgelagert wurde. Eigentlich hätte man es sowieso manuell "inline" programmiert, man holt den Schleifenkörper nur zur besseren Übersicht raus. Überflüssige Sprünge innerhalb einer Schleife können sehr teuer sein => Hier ist inline sinnvoll.

Viel verkehrt kann man damit nicht machen, außer eben, man setzt alles inline und bläht damit sein Programm massiv auf.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Nachteile von Inline-Funktion

Beitrag von Glocke » Do Feb 14, 2013 11:47 am

Xin hat geschrieben:Nutze inline, wenn Du eine Funktion inline halten möchtest. Das kann zum Beispiel auch bei größeren Funktionen sinnvoll sein, die z.B. den Körper eine Schleife beschreiben, wo der Schleifenkörper also nur ausgelagert wurde. Eigentlich hätte man es sowieso manuell "inline" programmiert, man holt den Schleifenkörper nur zur besseren Übersicht raus. Überflüssige Sprünge innerhalb einer Schleife können sehr teuer sein => Hier ist inline sinnvoll.
Super! Okay, danke :)

Lirrec
Beiträge: 15
Registriert: Mo Feb 20, 2012 11:55 am

Re: Nachteile von Inline-Funktion

Beitrag von Lirrec » Do Feb 14, 2013 11:52 am

Glocke hat geschrieben: Die Information, dass gerade eine inline-Funktion läuft? Was meinst du damit genau?
Der Compiler setzt den Code von inline-Funktionen doch direkt an Stelle der Funktion ein.... oder hab ich das falsch verstanden?
Stimmt schon, ich meinte damit z.B. die Möglichkeit im Debugger (z.B. wenn das Pogramm in der inline funktion crasht) zu sehen in welcher Codezeile das ganze passiert ist (man weiß an der Stelle ja nicht mehr, dass dieses Stück Code eigentlich zur inlinefunktion blah() gehört. ).
Aber im Prinzip hast du Recht, das sind alles Probleme die in einem ordentlichen Debug-Build wohl nicht auftreten werden.
Glocke hat geschrieben: Okay, also ein Hinweis :) Ist es nun sinnvoll inline zu verwenden... oder macht das der Compiler beim optimieren selbständig?
Meine Meinung:
Verwenden ja, aber sei dir bewusst, dass es nicht zwangsweise beachtet wird.
Es einfach vor möglichst viele Funktionen zu schreiben in der Hoffnung, dass das Programm dadurch schneller wird, ergibt aber keinen Sinn ;)
Die Richtigen Kandidaten sind in der Regel eher kleine Funktionen, es wird zb oft genutzt wenn du einen Header mit mathematischen (Helfer-)Funktionen hast ( Abstand zwischen 2 Punkten, solche Sachen), oder ähnliches, aber natürlich solltest du das im Einzelfall selbst entscheiden.
Außer der direkten Bedeutung für den Compiler ist es natürlich auch noch ein Hinweis an andere Programmierer ( dazu zählt i.d.R. auch das spätere selbst ;) ), wie die Funktion verwendet werden sollte/gedacht ist.
Xin hat geschrieben: Kaum ein Jahr angemeldet, schon der erste Beitrag ;-)
Bevor wir den Spamschutz hatten, habe ich unbeteiligte User nach drei Monaten gelöscht. Dann war's ja mal gut, dass ich das in der letzten Zeit eingestellt habe.

Willkommen an Board. ^^
Irgendwie hatte ich so eine Antwort erwartet ;) Ich les schon eine Weile mit, konnte mich bis jetzt aber nicht wirklich dazu bewegen auch was mitzuschreiben.
Jetzt, da ihr mich bemerkt habt, werd ich mich wohl auch noch Vorstellen ^^

EDIT:
mist, war wieder zu langsam ;)
@Xin: Der Aspekt bezüglich großen Funktionen stimmt natürlich, das hatte ich selber nicht so auf dem Radar.

Antworten