2015-01-19 4 views
12

ich den folgenden Code auf MSVC 2013 x64 kompiliert, Veröffentlichung mit/02 bauen:Warum verwendet MSVC den Stapel unnötig, wenn eine kleine Struktur in einem Register zurückgegeben wird?

struct Point 
{ 
    int x; 
    int y; 
}; 

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

Die für Assembler-Code generiert xUnit() ist:

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

Warum auf den Stapel ist es zu schreiben und dann sofort zurück in rax lesen, um zurückzukehren?

ich erwartet hätte:

mov rax, 1 
ret 0 
+8

Was Sie erwartet ist im Wesentlichen, was [Clang] (http://goo.gl/VvQPyO) und [GCC] (http://goo.gl/RN7Kmx) beide auf gcc.godbolt.org generieren. – Columbo

+1

Wow, das ist ein * extrem * nützliches Werkzeug, von dem ich nichts wusste. Vielen Dank! – japreiss

+6

Diese Funktion ist immer inline. Ein Blick auf nicht optimierten Code ist nicht sinnvoll. –

Antwort

3

X86-Version gut zu tun scheint (das heißt "mov eax, 1" erzeugen).

Meine Vermutung ist, dass X86 und X64-Versionen separate Codebasen sind und Optimierung in einem Ziel nicht unbedingt in der anderen gefunden wird.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). – Junaith

+2

OP fragt, warum eine bestimmte Optimierung nicht von einem bestimmten Compiler durchgeführt wird. Ich habe die Compiler-Ausgabe für dasselbe Programm mit denselben Flags für ein anderes Ziel (X86) getestet und den Code optimiert. Da MSVC kein Public-Domain-Compiler ist, ist es schwer zu sagen, warum - man kann MSVC-Team direkt spekulieren oder fragen. –

Verwandte Themen