Se si scrive un'applicazione che è molto latenza sensibile quali sono i limiti per l'incorporamento assemblatore all'interno di funzioni C++ (e utilizzando la funzione di C++ chiamate normalmente), in questo modo:L'incorporamento all'interno del C++ è accettabile?
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);
}
(La funzione di cui sopra è venuto da un altro post SO visto)
È possibile trattare funzioni integrate assembler come una scatola nera ? Potresti recuperare facilmente un risultato dai calcoli eseguiti nell'assemblatore? Ci sono pericoli che non sai quali variabili sono attualmente nei registri, ecc.? Fa più problemi che a risolvere, o è accettabile per compiti specifici?
(dove l'architettura sta per essere fissato, e conosciuto)
EDIT Ho appena trovato questo, questo è quello che sto suggerendo:
http://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C
EDIT2 questo è più rivolto verso Linux e x86 - è solo una domanda generale C++/assemblatore (o almeno così pensavo).
Stai chiedendo specificamente di Visual C++? Suppongo che altri compilatori potrebbero avere altri vincoli. –
@ Robᵩ No, se mai stavo puntando a Linux, ICC e G ++. Ho appena afferrato la prima funzione di assemblatore che ho visto. – user997112
Questo potrebbe essere leggermente OT, ma se un salto e un ritorno non comportano penalità troppo pesanti, considera di scrivere l'assemblatore in puro assemblatore (in un'unità separata di compilazione) per mantenere il tuo codice più portabile. Evitando l'inlining, a volte è possibile migliorare la latenza attraverso un utilizzo più efficiente della cache. Questo è più significativo sulle piattaforme embedded però. – psyill