C++ Inline Assembler: Was kann er?
-
Hallo Glamdrink,
ich wüsste nicht was mit dem Inline-Assembler von VC++ nicht gehen sollte. Jedoch frage ich mich warum du Sachen wie Klassen/Objekte mit Assembler verbinden willst. Was genau erhoffst du dir davon Assembler in C++ zu verwenden? Schneller wirst du dein Programm damit bestimmt nicht machen.
-
D.h. Alles, was unter Windowsprogrammierung fällt geht?
-
Glamdrink schrieb:
D.h. Alles, was unter Windowsprogrammierung fällt geht?
Ja - es geht alles im inline ASM. Wenn du lust hast kannst du auch cpp Klassen nutzen, und jede func in ASM schreiben.
Aber warum Inline? Inline wuerde ich nur fuer Optimierungen und dirty hacks nutzen.
Nimm doch direkt einen ASM Compiler wie NASM / MASM / TASM / GAS und code damit.Ich nutze inline fast gar nicht mehr - wenn dann wird ein externes objekt, das mit nasm compiliert ist gelinkt, und feddich
So brauchst du dir auch keine Sorgen machen, dass der Inlinecode von VC nicht mit GCC zusammenarbeitet usw.
-
Der Vorteil des Inline Assembler ist, dass er durch das Inline sehr schnell ist, da Funktionsaufrufe wegfallen.
Ich verwende Assembler ja auch nur in performancekritischen Passagen (oder wo es nicht anders geht), und wenn es performancekritisch ist, dann will ich auch maximale Leistung haben und mir jeglichen Overhead sparen (wie zB den Funktionsaufruf). Da besonders häufig aufgerufenen Funktionen optimiert werden, sollte man darüber nachdenken keinen externen Assembler zu benutzen, sondern inline zu arbeiten, um den Overhead zu vermeiden.
cya
liquid
-
LiquidAcid schrieb:
Der Vorteil des Inline Assembler ist, dass er durch das Inline sehr schnell ist, da Funktionsaufrufe wegfallen.
Kommt daraufan, wofuer man ihn braucht. Ich habe z.B. Math funktionen extern.
Denn 3DNOW, MMX usw. brauchen jeweils eine Funktion. Am Anfang wird einmal getestet welche, dann die Funktionen draufgepointert.
Wenn es eine komplette Funktion ist denke ich schon, dass man ihn extern machen kann, obwohl inlining natuerlich auch etwas fuer sich hat.
-
Nicht wenn du ein bestimmes System voraussetzt.
Inlining hat den großen Vorteil, dass die Funktionen gleich mit den oftmals schon in Registern gehaltenen Daten weiterarbeiten können, vorbei an den Calling Convention, wo Daten erst auf den Stack und dann wieder runter geholt werden müssen.
cya
liquid
-
Inline asm verhindert meistens jegliche Optimierung der enthaltenden Funktion, dadurch ist es eher kontraproduktiv, was Speed betrifft.
In dieser Hinsicht ist der inline asm von GCC wesentlich schlauer gemacht. Auch der von Watcom war recht gut, aber dieser Compiler ist wohl tot.
-
Das ist so nicht korrekt. Der Compiler kann sehr wohl optimieren, außer du hast den Code als volatile deklariert. Ich spreche jetzt allerdings vom Inline Assembler des GCC, wo es ebenfalls möglich ist, dem Compiler die Registerallokation zu überlassen - was durchaus seine Vorteile hat.
cya
liquid
-
Wir sprechen hier aber anscheinend von VC++.
Siehe auch meine Änderung in meinem vorigen Post.
-
LiquidAcid schrieb:
Nicht wenn du ein bestimmes System voraussetzt.
Soetwas ist leider sehr selten. Normal wenn ein Produkt fuer die Masse erstellt wird, und nicht fuer ein bestimmtes System, kann man nichts mehr wirklich voraussetzen. Ausser man verzichtet auf die Prozessorfeatures, der neueren Prozessoren, also 3DNow, SSE, SSE2 ...
Wenn man natuerlich ein Produkt fuer jemanden erstellt, der genau ein System hat - z.B. z.B. 100 Mhz ARM Prozessor oder so, dann geht's schon.
-
Es gibt viel Software, die bestimmte Features einfach voraussetzen. Nicht nur kommerzielle, sondern auch freie.
Zumal ich das Prinzip der bedingten Kompilierung auch besser finde. Man erstellt mehrere Binaries, jede auf eine bestimmte Architektur optimiert, eine "flächig" optimiert, aber nicht abhänging von einer bestimmte Architektur.
Dieses Runtime Gewusel ist in meinen Augen nicht besonders performanceschonend, wenn schon bei einer einfachen Vektoraddition per Funktionszeiger entschieden wird, welche Methode denn nun verwendet wird (3DNow, SSE, SSE2, SSE3 oder Standard x86).
cya
liquid