ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4396323
Jetzt (Chat):
14 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Woran erkenne ich, wann mein Compiler eine Funktion inlined?
Normal
AutorThema
BlueShark Offline
ZFX'ler


Registriert seit:
05.05.2005

Niedersachsen
Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Moin moin,
ich habe schon so einiges von dem Schlüsselwort inline gehört, weiß im großen und ganzen auch wie es funktioniert. Doch eine Sache ist mir noch immer ziemlich schleierhaft.

Woran kann ich den nun konkret erkennen ob mein Comipler eine meiner Funktionen geinlined hat?

Ich verwende CodeBlocks mit dem gcc-Compiler.

Mfg BS
30.01.2009, 23:12:00 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Lass dir den Assembler-Code ausgeben und überprüf alle Stellen, an denen du die Funktion aufrufst …

Performance-Messungen sind nicht zuverlässig, weil je nach Situation inline schneller, gleich schnell oder langsamer sein kann (was ja auch der Grund ist, warum die Entscheidung letztendlich dem Compiler obliegt und nicht dem Programmierer) …

… was genau ist den dein Motiv?

Gruß, Ky
30.01.2009, 23:37:00 Uhr
BlueShark Offline
ZFX'ler


Registriert seit:
05.05.2005

Niedersachsen
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Nun ja, dass ist pures Interesse. Weil ist ja schön und gut, dass ich inline benutzen kann, jedoch wäre es interessant mal zu sehen, ob es nicht einfach reicht den Code zu schreiben ohne sich über so etwas wie inline überhaupt Gedanken zu machen, da der Compiler das ja eh besser entscheiden kann.

Und ich wollte eigentlich nur wissen, ob man dass schnell und direkt an der Ausgabe des Compilers sehen kann, dem ja nicht so ist.

Mal nee andere Frage, wie kann ich mir den von meinem Compiler den Assembler-Code ausgeben lassen? Ich kann das bis jetzt nur während des Debugs. Wäre aber echt nett, wenn der mir mein Programm in Assembler in ner Datei zwischenspeichern könnte. Geht sowas überhaupt?

Leider bin ich im Umgang mit Compiler und Debugger wohl eher ein blutiger Anfänger und muss da noch nee Menge lernen.

Mfg
BS
31.01.2009, 11:10:30 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Gedanken brauchst du dir darüber wirklich nicht machen, wenn du mit voller Optimierung kompilierst … es gibt genug andere Performance-Tipps, die viel mehr bringen als inline.

Nette Geschichte: Als ich zuletzt templates auf ihre inline-Fähigkeit und ihre Performance testen wollte, hat mir VC einfach das komplette Benchmark wegoptimiert und durch das Ergebnis ersetzt … als ich das Ergebnis dann von User-Eingaben abhängig gemacht habe, hat VC auch die Abhängigkeit von diesen Eingaben ermittelt und damit mein Benchmark ersetzt … es ist heutzutage also wirklich fast sinnlos Heißt nicht, dass man nicht ab und zu noch was reißen könnte, aber dazu braucht es eine Menge Erfahrung und vor allem viel Glück.

Mit dem Assembler-Code bin ich überfragt, zum einen kenne ich ihn auch nur vom Debugging und zum anderen benutze ich eh nur Visual C++ (dort habe ich gerade nachgeschaut, man kann sich den Assembler-Code nur ausgeben lassen, wenn das Projekt aus einer einzelnen Datei besteht).

Gruß, Ky
31.01.2009, 11:29:57 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Zitat:

dort habe ich gerade nachgeschaut, man kann sich den Assembler-Code nur ausgeben lassen, wenn das Projekt aus einer einzelnen Datei besteht

Nun, dann machst du irgendwas falsch

@inline
Es sollte nicht vergessen werden dass inline zwei Bedeutungen hat ...

a) 'a function declared as inline is defined in every translation unit where it is used'
b) 'inline is a hint to the compiler to inline the function'
(frei nach ISO C++)

Letzteres kriegt ein Compiler auch selber hin ... ersteres hingegen ist die einzige Möglichkeit Funktionen in einem Namespace-Scope innerhalb eines Headers sowohl zu deklarieren als auch zu definieren ohne dass bei Inkludierung durch mehrere Units ein Linkerfehler produziert wird.

Gruß,
Alex
31.01.2009, 11:47:40 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Zitat von Aramis:
Nun, dann machst du irgendwas falsch
Kann sein, ich habe jedenfalls Fehler D8036 an den Kopf geschmissen bekommen … jetzt gerade habe ich hier nichts Kompilierfähiges rumliegen, aber ich kann es ja nachher nochmal versuchen.

Das mit der Definition ist aber in der Tat ein großer Vorteil – hatte letztens ein Amok-template, das solange nicht die Spezialisierung anerkennen wollte, bis ich sie direkt in den Header gepackt habe … aber nicht exzessiv einsetzen, sonst leidet auf Dauer die Kompilierzeit …

2 Mal gendert, zuletzt am 31.01.2009, 12:00:00 Uhr von Krishty.
31.01.2009, 11:59:11 Uhr
BlueShark Offline
ZFX'ler


Registriert seit:
05.05.2005

Niedersachsen
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
@Kristhy:
Das ist ja echt nee nette Sache. Nennt man das nicht Metaprogrammierung? Wage mich da an einen Artikel aus Game Programming Gems zu erinnern, der genau das behandelt was du da beschrieben hast. Kann aber auch sein, dass ich hier falsch liege.

@Aramis:
Zitat:
Es sollte nicht vergessen werden dass inline zwei Bedeutungen hat ...

a) 'a function declared as inline is defined in every translation unit where it is used'
b) 'inline is a hint to the compiler to inline the function'
(frei nach ISO C++)

Ich glaube das ist doch das selbe was in diesem Post angesprochen wird, oder?(Die einzelnen "Arten" von inline's)
http://zfx.info/DisplayThread.php?TID=17546

Mfg
BS
31.01.2009, 12:41:58 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Wenn du sehen willst, was der Compiler wie inlined, versuch einfach mal FORCE_INLINE ( oder etwas ähnliches, MSDN ist dein Freund ), damit weist du den Compiler des VS dazu an, etwas definitiv zu inlinen. Aber das geht IMHO nur unter dem VS, FORCE_INLINE ist kein Standard.
Und dann die Option Disassemblierung wählen.

Gruß Kimmi
31.01.2009, 12:57:49 Uhr
Kurzer Weblog
BlueShark Offline
ZFX'ler


Registriert seit:
05.05.2005

Niedersachsen
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Ähem Kimmi, ich würde das ja gerne tun, dass Problem daran ist nur, dass ich aus Prinzip VC++ verachte und deswegen ja CodeBlocks verwende(mit dem gcc). Das hatte ich am Anfang eigentlich auch geschreieben.

Zitat:
MSDN ist dein Freund

Nicht wirklich. Meiner Meinung nach ist die MSDN zum größten Teil Mist. Und ich muss ganz ehrlich sagen, dass ich allgemein mit den Sachen von Microsoft immer weniger zurechtkomme. Ich hab mit VC++ angefangen. Da das Programm mit jeder neuen Version immer mehr von meinen Systemressourcen fraß hab ich mich nach ner anderen IDE umgesehen.

Weiter ging es mit ner API für meine Programme. Zuerst hab ich WinAPI gelernt, das Programmieren hat mir zu der Zeit damit keinen richtig großen Spass gemacht. Dann kam für mich MFC, besser als WinAPI, dennoch irgendwie immernoch ein wenig unhandlich. Und dann kam ja dieses C#??? Naja dann bin ich auf wxWidgets umgestiegen, weil ich ne Cross-Plattform Lösung haben wollte.

Und naja vom Betriebssystem wollen wir nicht reden. Vista ist meiner Meinung nach der größte Schrott, den ich je gesehen habe.

Und naja, mit den restlichen Produkten sieht es ähnlich aus. Internet Explorer, Windows Media Player, Mircosoft Office, Outlook Express kann man, wie ich finde, echt vergessen es gibt definitiv viel bessere Alternativen dafür, die zum Teil mehr leisten und besser laufen.

Ojeeee, da hab ich mich wohl ein wenig ausgelassen. Sry, aber seit die mir auf ein Notebook Windows Vista draufgespielt haben bin ich mit Microsoft aufm Kriegsfuß. Ich meine, dass lief auf niedrigsten Einstellungen nicht mal flüssig auf meinem kleinen 2GHz Notebook mit 1Gb RAM, dass kann doch einfach nicht angehen.

Also kurz, ich brauch wenn dann schon ne Alternative für CodeBlocks mit dem gcc-Compiler.

Sorry fürs flamen.
Mfg BS
31.01.2009, 13:23:28 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
@BlueShark: Templates sind generell Metaprogrammierung … sind tatsächlich sehr nützlich wenn man über Container-of-T hinaus geht. Ach ja, ich verachte übrigens Leute, die „aus Prinzip“ verachten …


@Kimmi: Meinst du das Schlüsselwort __forceinline? Auch das bringt nicht uneingeschränkt inline …
Zitat:
You cannot force the compiler to inline a particular function, even with the __forceinline keyword.
… aber dann gibt es zumindest eine Warnung, dass es nicht geht. Könnte also in so einem Fall weiterhelfen.


@Aramis: Du hattest Recht Ich hatte direkt einen Namen für den Assembler-Output angegeben, was nicht hätte sein sollen … jetzt funktioniert es.

2 Mal gendert, zuletzt am 31.01.2009, 13:46:17 Uhr von Krishty.
31.01.2009, 13:25:24 Uhr
BlueShark Offline
ZFX'ler


Registriert seit:
05.05.2005

Niedersachsen
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Zitat:
Ach ja, ich verachte übrigens Leute, die „aus Prinzip“ verachten …

nice one Mag sein, dass ich dem VC++ damit unrecht tue, aber mit jeder Version die rauskam wurde die Arbeit immer schleppender(grafisch zwar ansprechender, aber das ist sowas von egal). Und naja Hardware ist eben teuer. Wobei ich ganz ehrlich gestehen muss, dass ich mit der 2004 oder 2006(weiß nicht mehr wirklich welche es war) als letztes gearbeitet habe. Vielleicht hat es sich ja zum Guten gewendet, aber wenn ich mir die Entwicklung von Windows ansehe bezweifle ich das.

Zitat:
@Kimmi: Meinst du das Schlüsselwort __forceinline? Auch das bringt nicht unbedingt was …
Zitat:
Zitat:
You cannot force the compiler to inline a particular function, even with the __forceinline keyword.

… aber dann gibt es zumindest eine Warnung, dass es nicht geht.

Stimmt. Es gibt jedoch noch die Möglichkeit dem Compiler seinen Willen aufzuzwingen. Wenn ich mich recht erinnere gibt es bei Flipcode.com einen Artikel, in dem es wichtig ist, dass so viel wie möglich ge-"inline"-d wird.

Hier sind die Befehle(funzt soweit ich weiß nur mit dem VC++):
Code:
#pragma inline_depth(255)
#pragma inline_recursion(on)
#pragma auto_inline(on)

inline_depth ist die Tiefe, bis zu der er inlinen soll
inline_recursion sagt ihm, dass er rekursiv inlinen soll
auto_inline eben das normale auto inlinen aktivieren

Trotzdem zwingt es den Compiler nicht unbedingt dass zu tun, was man will, jedoch kann man somit schon mal mehr inlinen als mit forceinline oder inline.

Mfg
BS

1 Mal gendert, zuletzt am 31.01.2009, 13:50:20 Uhr von BlueShark.
31.01.2009, 13:45:34 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Woran erkenne ich, wann mein Compiler eine Funktion inlined?Nach oben.
Ups, da war ich glatt am Editieren als du gepostet hast …

Ja, aber wie gesagt, mir erschließt sich da nicht wirklich der Nutzen draus … wäre schön, wenn du den Link zum Artikel hättest (in den Archiven habe ich per Schnellsuche nichts gefunden).

Wir kommen eh gerade an eine Stelle, wo dank schneller CPUs, guter Compiler und dem x64-Umstieg die „guten alten Kniffe“ wie man sie auch oft auf Flipcode findet (Inlining hier oder da, zwischendurch ein wenig Assembler, die Funktionsparameter umsortieren, durch Templates die Befehlsfolge umorganisieren) an Bedeutung verlieren …
31.01.2009, 13:53:46 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel