wie inludier ich inline funs?



  • hi!
    ich brauch ein paar umrechen-/umwandlungsfuktionen und die müssen schnell sein! also inline...(dacht ich..)
    ich hab die funktionen in eine eigene datei converters.h/converters.cpp gepackt und will sie bei bedarf inkludieren.
    geht aber nicht, weil der linker mir dann undefined references verkündet!
    warum?
    wie kann ichs machen, dass ich diese funktionen bei bedarf in einigen der klassen die ich verwende inkludieren kann?

    danke
    prokaion



  • prokaion schrieb:

    hi!
    ich brauch ein paar umrechen-/umwandlungsfuktionen und die müssen schnell sein! also inline...(dacht ich..)

    Kümmer dich lieber ums Optimieren von deinen Algorithmen als um Sachen, die dein Compiler eh für dich macht, wenns sinnvoll ist.

    ich hab die funktionen in eine eigene datei converters.h/converters.cpp gepackt und will sie bei bedarf inkludieren.
    geht aber nicht, weil der linker mir dann undefined references verkündet!
    warum?

    Code? Sind die Dateien deinem Projekt hinzugefügt? Oder machst dus über Kommandozeile und hast die Dateien nicht als Referenz angegeben?



  • inline-Funktionen definiere ich stets in der Header-Datei, genau die Methoden von Templateklassen.

    "inline" bedeutet außerdem nicht, dass die Funktion schneller wird, sondern dass der Funktionsaufruf durch den Funktionscode ersetzt wird, was dann wiederum für weitere Optimierungsmöglichkeiten sorgt. Ab einer gewissen Größe von Funktionen sollte man ohnehin nicht inlinen, da das je nach der Anzahl der Funktionsaufrufe viel Coden werden kann.



  • achso! wie template-klassen verwenden!
    das macht sinn!
    ja, doch funktioniert!! danke!

    ps:
    schneller werden die wohl nicht aber man spart sich doch einen sprung zu der jeweiligen funktion weil der body doch direkt an der stelle des aufrufs eingefügt wird, oder?

    -die funs sind ganz klein und rufen auch keine komplizierten konstruktoren auf, nur eingebaute typen...



  • Auf inline würde ich mich nicht verlassen wegen dem schneller werden
    1. Der Compiler kann es sich aussuchen ober sie dann wirklich inline deklariert
    2. Der Code wird dann viel größer und größerer Code kann das ganze Programm langsamer machen.

    Also benutz inline funktion nur wenn sie wirklich klein sind ansonsten lass die Finger davon!



  • prokaion schrieb:

    achso! wie template-klassen verwenden!
    das macht sinn!

    Nein, macht überhaupt keinen Sinn.

    ps:
    schneller werden die wohl nicht aber man spart sich doch einen sprung zu der jeweiligen funktion weil der body doch direkt an der stelle des aufrufs eingefügt wird, oder?

    -die funs sind ganz klein und rufen auch keine komplizierten konstruktoren auf, nur eingebaute typen...

    Herrlich, diese Mikrooptimierungen. Tipp: Lass es einfach. Ich schreib nie inline, mein Compiler wirds schon hinkriegen. Stattdessen solltest du dich auf die wichtigen Sachen konzentrieren wie gutes Design und schnelle Algorithmen.



  • ich hab noch nie irgendwas inline geschrieben. das ist jetzt premiere für mich!

    der compiler schreibt irgendwelche funs ausserhalb von klassen selber inline, wenn er es für richtig hält?
    sind die compiler (in meinem fall gcc) wirklich SO gut?



  • Also Bedingung fürs inlining ist sicher erstmal dass die Definition innerhalb derselben Compileeinheit bekannt ist, sonst kann der Compiler die Bindung nur dem Linker überlassen. Also muss sie innerhalb der Klasse, oder ausserhalb der Klasse aber in einer .h-Datei, die dort includet wird wo sie benutzt wird, sichtbar sein (oder natürlich zufällig in der selben .cpp-Datei). Dann, ja dann allerdings sind heutige Compiler wirklich SO gut 😉 dass sie zumeist selbst entscheiden können welche Aufrufart die besten Optimierungen ermöglicht.



  • prokaion: Wirf doch mal einen Blick in die FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-105893.html



  • faq gelesen, danke!
    dann machts in meinem fall wohl doch sinn die funs inline zu deklarieren:
    da ich die funs SEHR wahrscheinlich in mehreren ÜE´s brauchen werde, muss ich sie inline deklarieren, damit ich die "one definition rule" nicht verletze. der compiler braucht ja immer die komplette definition, um eine funktion inline machen zu können, wenn ick das jetzt richtig verstanden habe....

    daniel


Anmelden zum Antworten