2015-01-19 4 views
12

Ho compilato il seguente codice su MSVC 2013 x64, build di rilascio con/02:Perché MSVC utilizza lo stack inutilmente quando si restituisce una piccola struttura in un registro?

struct Point 
{ 
    int x; 
    int y; 
}; 

Point xUnit() 
{ 
    Point p; 
    p.x = 1; 
    p.y = 0; 
    return p; 
} 

Il codice assembly generato per xUnit() è:

mov QWORD PTR p$[rsp], 1 
mov rax, QWORD PTR p$[rsp] 
ret 0 

Perché scrivi alla pila e poi leggere immediatamente in rax per tornare?

mi sarei aspettato:

mov rax, 1 
ret 0 
+8

Quello che ti aspettavi è essenzialmente ciò che [Clang] (http://goo.gl/VvQPyO) e [GCC] (http://goo.gl/RN7Kmx) generano entrambi su gcc.godbolt.org. – Columbo

+1

Wow, questo è uno * estremamente * strumento utile che non conoscevo. Grazie! – japreiss

+6

Questa funzione sarà sempre in linea. Guardare il codice non ottimizzato non è utile. –

risposta

3

versione X86 sembra fare bene (cioè generano "eax mov, 1").

La mia ipotesi è che le versioni X86 e X64 sono basi di codice separate e l'ottimizzazione trovata in un obiettivo non è necessariamente presente nell'altro.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – Junaith

+2

L'OP sta chiedendo perché una particolare ottimizzazione non viene eseguita da un particolare compilatore. Ho testato l'output del compilatore per lo stesso programma con gli stessi flag per un target diverso (X86) e ha ottimizzato il codice. Dato che MSVC non è un compilatore di dominio pubblico, è difficile dire perché - si può speculare o chiedere direttamente al team di MSVC. –