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
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
Wow, to jest * niezwykle * przydatne narzędzie, o którym nie wiedziałem. Dzięki! – japreiss
Ta funkcja zawsze będzie inline. Patrzenie na niezoptymalizowany kod nie jest użyteczne. –