Wenn Sie eine Anwendung schreiben, die sehr Latenz empfindlich, was die Grenzen, innerhalb C++ Funktionen Einbettung Assembler sind (und mit der C++ Funktion ruft normalerweise), etwa so:Einbettung von Assembler in C++ akzeptabel?
inline __int64 GetCpuClocks()
{
// Counter
struct { int32 low, high; } counter;
// Use RDTSC instruction to get clocks count
__asm push EAX
__asm push EDX
__asm __emit 0fh __asm __emit 031h // RDTSC
__asm mov counter.low, EAX
__asm mov counter.high, EDX
__asm pop EDX
__asm pop EAX
// Return result
return *(__int64 *)(&counter);
}
(Die obige Funktion kam aus ein weiterer SO Post, den ich sah)
Können Sie assembler-inline Funktionen wie eine Black Box behandeln? Könnten Sie leicht ein Ergebnis aus Berechnungen in Assembler abrufen? Gibt es Gefahren, dass Sie nicht wissen, welche Variablen derzeit in Registern usw. sind? Führt es zu mehr Problemen als zur Lösung oder ist es für bestimmte kleine Aufgaben akzeptabel?
(Nehmen Sie Ihre Architektur festgelegt werden soll, und bekannt)
EDIT ich dies nur gefunden, das ist, was ich anspielend auf:
http://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C
EDIT2 Dieses mehr richtet sich in Richtung Linux und x86 - es ist nur eine allgemeine C++/Assembler Frage (oder so dachte ich).
Fragen Sie speziell zu Visual C++? Ich nehme an, dass andere Compiler andere Einschränkungen haben können. –
@ Robᵩ Nein, wenn überhaupt, zielte ich auf Linux, ICC und G ++. Ich habe gerade die erste Assembler-Funktion genommen, die ich gesehen habe. – user997112
Dies könnte etwas OT sein, aber wenn ein Sprung und eine Rückgabe keine zu hohen Strafen nach sich ziehen, sollten Sie den Assembler in reinem Assembler (in einer separaten Kompiliereinheit) schreiben, um Ihren Code portabler zu halten. Durch das Vermeiden von Inlining können Sie manchmal die Latenz durch eine effizientere Cache-Nutzung verbessern. Dies ist jedoch auf Embedded-Plattformen wichtiger. – psyill