inline bei Get-Funktion sinnvoll/problemlos möglich?

pointhi

Erfahrenes Mitglied
Hy, ich hab heute etwas über inline bei C++ gelesen und hab auch gleich mögliche Anwendungen gefunden. Ich wollte aber noch fragen, bevor ich so um die 100 Get-Funktionen ändere ob die verwendung von inline sinnvoll ist und ob es nicht zu problemen kommen kann.
Es wird ja der inhalt der Funktion nicht aufgerufen sondern an dem Platz im Quelltext kopiert. Kann es zu fehlaufrufen kommen wenn die Get Funktion in einer Klasse liegt und eine andere Klasse diese aufruft?

Der Code so einer Get-Funktion sieht derzeit so aus:

Code:
double Time::GetStandardEpocheJ2000( void )
    {
    return ( this->dwStandardEpocheJ2000 );
    }

Das ganze würde danach so ausschauen ;-)

Code:
inline double Time::GetStandardEpocheJ2000( void )
    {
    return ( this->dwStandardEpocheJ2000 );
    }

wäre dankbar über eine antwort. Wäre schlecht alles zu ändern um dann einen Fehler festzustellen oder zu bemerken dass das Programm eher klobriger und langsamer geworden ist. Auch soll das Programm (Library) später in eine DLL gepackt werden.

mfg. pointhi
 
Zuletzt bearbeitet:
Bei einer normalen Funktion "springt" der Compiler beim Funktionsaufruf einfach zum Quelltext der Funktion, führt sie durch und "springt" dann wieder zurück an die Stelle, an der die Funktion aufgerufen wurde. Dabei müssen natürlich die Funktionsargumente kopiert werden, um zur Funktion geschickt zu werden, es muss die Zeile, an der der Funktionsaufruf stattfindet, gespeichert werden, damit der Compiler wieder zurückfindet usw.

Bei inline Funktionen wird einfach der Quellcode der Funktion an die Stelle, an der der Funktionsaufruf steht, kopiert. Bei kleinen Funktion ist dies vorteilhaft, weil man dadurch die Argumente nicht auf den Stack werfen muss. Bei größeren Funktion ist es jedoch nicht so ratsam, weil viel Quellcode kopiert werden muss.

inline-Funktionen sind also nur eine Performance-Hilfe. Das Verhalten ist dasselbe wie bei einer normalen Funktion.

Lg
 
Ergänzung:
Der Compiler macht auch von sich aus Funktionen inline, ohne dass man das Wort dazuschreibt,
die dadurch die Programmdatei nicht zu sehr vergrößern.
Das Ganze als Teil der Geschwindigkeitsoptimierung.

Und Probleme...zB. rekursive Funktionen können nicht einfach so inline sein
(wenn man "inline" dazuschreibt passiert aber auch nichts schlimmes, es wird nur einfach nicht).

PS: Soweit ich weiß, muss sich der Compiler auch nicht an inline halten...nur "kann".
 
ok, dann schreib ich zu den Get-Funktionen inline dazu, dass der compiler weiß was ich gerne hätte XD

mfg. pointhi
 
geht ned richtig:

Code:
inline double Time::GetJulianDate( void )
    {
    return ( this->dwJulianDate );
    }

erzeugt die Fehlermeldung:

Code:
obj\Release\satpos\satpos_orbit.o:satpos_orbit.cpp|| undefined reference to `satpos::Time::GetJulianDate()'|
obj\Release\satpos\satpos_orbit.o:satpos_orbit.cpp|| undefined reference to `satpos::Time::GetJulianDate()'|
||=== Build finished: 2 errors, 0 warnings ===|

ohne inline funktionierts.

mfg. pointhi
 
Gib bitte ein bisschen mehr Code, vor allem wo der Aufruf stattfindet und eventuell den satpos namespace.

Lg
 
der namespace umfasst über 5000 Zeilen!

ich stell zur einfachheit die library als anhang. In dieser Version sind die inline elemente entfernt, in satpos_time ist die Klasse "Time", mit search sollte man schnell die Codeteile identifizieren können. Ich arbeite gerade die komplette library um weshalb nicht alle Funktionen implementiert sind oder ganz fehlen. Sie ist deswegen sehr Buggy.

Mal als frage, ist es sinnvoll wenn eine Klasse seine eigenen Set-Funktionen zum ändern der Variablen aufruft?

mfg. pointhi
 

Anhänge

Zuletzt bearbeitet:
ok, dann werde ich wohl auf inline verzichten. Die Library hat kreuz und quer abhängigkeiten, und ich will die klassendeklarationen und deren code getrennt halten, damit die übersichtlichkeit nicht noch mehr leidet.

mfg. pointhi
 
Zurück