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

1

26.12.2010, 20:18

inline-Funktionen nur wenn kein Prototyp?

Hallo, zusammen!

Auf Seite 96 in der Erklärung für inline-Funktionen steht geschrieben, dass der Compiler den Code der Funktion vor dem ersten Aufruf schon einmal gesehen haben muss, damit ein inline überhaupt erstmal in Frage kommt, also dass man für inline-Funktionen nicht die Prototyp-Variante verwenden kann.

Hmm...irgendwie kommt mir das aber seltsam vor, denn Prototypen können auch inline markiert werden, auf folgender Seite werden inline-Funktionen sogar an einem Beispiel erklärt, welches einen Prototypen verwendet: http://www.exforsys.com/tutorials/c-plus…-functions.html

Außerdem hab ich mal ein bisschen disassembled und wie erwartet ist die Prototyp-Variante ebenfalls geinlined worden.


Das verwirrt mich jetzt alles ein wenig, könnt ihr mich bitte aufklären?


Danke im Voraus
Xtremebergi

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.12.2010, 20:37

Das ist dann wohl eine Falschaussage, denke ich. Was der Autor da evtl. sagen wollte, ist Folgendes:

1) Prototyp
2) Aufruf
3) Implementation

In der Reihenfolge geht es nicht, weil zum Zeitpunkt des Aufrufs der Compiler den Code der Funktion noch nicht kennt und daher nicht inlinen kann. So aber:

1) Prototyp
2) Implementation
3) Aufruf

sollte das Inlinen klappen, genauso wie bei

1) Implementation
2) Aufruf
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

26.12.2010, 21:11

Ja, mit Prototyp-Variante meinte ich bereits:

1. Prototyp
2. Aufruf
3. Implementation

Noch einmal Verweis auf die Seite, deren Link ich oben geschrieben habe. Dort wird genau diese Reihenfolge verwendet, und laut Disassembling wird wirklich geinlined.

?(

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

26.12.2010, 21:16

Ahso. Benutzt Du Link Time Code Generation? Das ist ein Trick neuerer Compiler, den Code erst beim Linken zusammenzustellen. Dadurch weiß der Compiler viel besser, z.B. welche Parameter einer Funktion konstant sind. Und er kann natürlich beliebig inlinen, egal wo und wann eine Funktion implementiert wurde. Ich vermute, das ist bei Dir der Fall. Visual Studio kann das seit der 2005er, der GCC kann es nach meinem Wissen auch, auch wenn er dafür glaube ich einen anderen Namen hat.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

26.12.2010, 22:38

Ahaa! Das erklärt natürlich so einiges.

Ok, nun bleiben noch 2 Fragen übrig:

1. Kann man LTCG in Visual C++ 2008 zu Testzwecken auch austellen? Ich sehe als Einstellungsmöglichkeiten nur verschiedene ltcg-Arten (Profile Guided Optimization), dann ein <inherit from parent or project defaults> und Default...

2. Wenn man LTCG an hat, sollte man beim Prototypen und/oder bei der Definition inline schreiben? Oder ist es egal, Hauptsache mindestens einmal?

(Ich weiß, das hier geht schon sehr ins Detail, aber ich will es genau wissen)

6

27.12.2010, 12:07

Zitat

2. Wenn man LTCG an hat, sollte man beim Prototypen und/oder bei der Definition inline schreiben? Oder ist es egal, Hauptsache mindestens einmal?

Das kannst du dir sowieso komplett sparen. Ein guter Compiler weis sehr viel besser, wann er inlinen kann /sollte als du, und macht es dann sowieso automatisch. Behalte ausserdem im Hinterkopf, dass eine Funktion die du inline deklarierst sowieso nicht zwangsläufig inline wird. Das ist nur eine Art vorschlag an den Compiler.

7

27.12.2010, 12:18

Ja, das hab ich beim Disassemblen schon deutlich gemerkt. Denn wenn er inlined, macht er es auch wenn man kein inline davor schreibt und wenn nicht, dann auch nicht mit einem inline (nur mit einem __forceinline) Also irgendwie hat inline kaum einen Einfluss.
Ok ich werde es in Zukunft einfach dem Compiler überlassen, und wenn wirklich zeitkritische Sachen zu machen sind, werde ich mir einfach die exe anschauen, ob er es macht oder nicht und wenn umbedingt nötig, ein __forceinline verwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Xtremebergi« (27.12.2010, 12:28)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

27.12.2010, 12:50

Aha, ok, ich werde mir einfach keine Gedanken mehr über inline machen, ich überlasse das einfach dem Compiler.

Danke, euch allen!



Ich wünsche noch einen guten Rutsch!

Xtremebergi

Werbeanzeige