2015-01-19 7 views
12

Skompilowałem następujący kod na MSVC 2013, 64, Release zbudować z/02Dlaczego MSVC niepotrzebnie używa stosu przy zwracaniu małej struktury do rejestru?

struct Point 
{ 
    int x; 
    int y; 
}; 

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

Wygenerowany kod montaż do xUnit() jest:

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

Dlaczego pisać na stosie, a następnie natychmiast wrócić do rax, aby powrócić?

się było spodziewać, że:

mov rax, 1 
ret 0 
+8

To, czego się spodziewałeś, to w zasadzie to, co [Clang] (http://goo.gl/VvQPyO) i [GCC] (http://goo.gl/RN7Kmx) generują na gcc.godbolt.org. – Columbo

+1

Wow, to jest * niezwykle * przydatne narzędzie, o którym nie wiedziałem. Dzięki! – japreiss

+6

Ta funkcja zawsze będzie inline. Patrzenie na niezoptymalizowany kod nie jest użyteczne. –

Odpowiedz

3

wersja X86 wydaje się dobrze (czyli generować "mov eax, 1").

Domyślam się, że wersje X86 i X64 są oddzielnymi podstawami kodu, a optymalizacja znaleziona w jednym celu niekoniecznie występuje w drugim.

+0

Nie daje to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować swoje posty, a gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation), być w stanie [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment). – Junaith

+2

OP pyta, dlaczego konkretna optymalizacja nie jest wykonywana przez konkretny kompilator. Przetestowałem dane wyjściowe kompilatora dla tego samego programu z tymi samymi flagami dla innego celu (X86) i zoptymalizowałem kod. Ponieważ MSVC nie jest kompilatorem publicznie dostępnym, trudno powiedzieć dlaczego - można bezpośrednio spekulować lub zapytać zespół MSVC. –