Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

03.12.2010, 00:06

Das Problem ist dass man nicht einfach pauschalisieren kann. Manche Compiler sind wirklich gut dabei automatisch richtig zu inlinen andere weniger. Inline kann sich sowohl positiv als auch negaitv auf die Performance auswirken. Einfache Dinge wie Constant Folding erledigt MSVC 10 in allen Trivialbeispielen die ich jetzt mal probiert hab zugegeben auch gleich gut ohne inline. Nur kann man daraus nicht schließen dass inline nichts bringt. Ich verweise vielleicht einfach mal weiter auf das
Abgesehen davon hat man oft gar keine andere Wahl als inline, z.B. im Zusammenhang mit templates...

Tobiking

1x Rätselkönig

  • Private Nachricht senden

22

03.12.2010, 01:50

Zum Thema Definitionen in Header Dateien:
Das Inline wird in der einfachen Variante vom Compiler erledigt. Kennt der Compiler die Funktion, sowie die Situation vor und nach dem Aufruf, kann er den Rumpf passend dort einsetzen. Da aber unabhängig voneinander compiliert wird, muss die Funktion in der Quellcodedatei (bzw. über einen Header eingebunden werden), in dem der Funktionsaufruf auch steht. Das verpflichtende inline im Header sagt dem Compiler eigentlich nur das er diese Funktion unter keinen Umständen exportieren soll, da es sonst beim Linken zu Konflikten kommt.

Nehmen wir jetzt den Fall das man zwei Quellcodedateien hat, A mit dem Funktionsaufruf und B mit der Funktion. Dann kriegt der Linker nun die beiden Objektfiles vom Compiler mit dem fertigen Maschinencode zum Zusammensetzen. Ich weiß nicht genau was dort an Informationen fehlt (wahrscheinlich Aufrufkonvention, benutzte Variablen o.ä.), aber der Linker ist nicht in der Lage den Maschinencode der Funktion passend für den Funktionsaufruf, der auch nur als Maschinencode vorliegt, einzusetzen. In diesem Fall wird kein inline gemacht, egal was man dort hinschreibt.


Die aufwändigerere Variante, die VS schon länger (Seit 2005?) und gcc seit 4.5 (noch gar nicht so lange!) beherrschen, ist Link-Time code generation. Die Idee ist recht einfach. Der Compiler erzeugt keinen Maschinencode, sondern Bytecode, der deutlich mehr Informationen enthält. Das eigentliche Erzeugen von Maschinencode wird nun vom Linker durchgeführt. Dafür hat dieser aber nun mehr Informationen um über Dateigrenzen zu Optimieren und insbesondere auch zu inlinen.

23

03.12.2010, 11:22

Ist es nicht so das wenn eine Funktion Inline gemacht wird das sie dann vom Compiler immer da platziert wird wo sie gebraucht wird. Ist eine Funktion nicht inline wird mit dem Stack gearbeitet der die Rücksprung addresse speichert.

Das heist aber auch das bei vielen verschiedenen aufrufen der Inlinefunktion die Exe/dll was auch immer sich aufbläht aber dafür die perfomance etwas besser wird

So habe ich es jedenfalls mal gelehrt bekommen.



Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige