Показать сообщение отдельно
Старый 22.08.2016, 21:04   #10
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Decompiled Unity5.3 (c#)

Добавлю
var vector = new Vector2(0, 0);
000007FF001735A4  xor         eax,eax  
000007FF001735A6  mov         qword ptr [rsp+20h],rax
Без инлайнинга ([MethodImpl(MethodImplOptions.NoInlining)]):
var vector = Vector2.Zero;
000007FF0019348E  call        000007FF0005C940  
000007FF00193493  mov         qword ptr [rsp+28h],rax
Здесь в rax - вся структура (8 байт). Код был бы немного другим если бы структура не влезала в регистр целиком:
Это код геттера для Vector3

000007FE7F9D4670  vxorps      xmm0,xmm0,xmm0  
000007FE7F9D4675  vxorps      xmm1,xmm1,xmm1  
000007FE7F9D467A  vmovss      dword ptr [rcx],xmm0  
000007FE7F9D467F  vmovss      dword ptr [rcx+4],xmm1  
000007FE7F9D4685  vmovss      dword ptr [rcx+8],xmm1  

Видно что он сразу пишет значения в структуру указатель на которую лежит в rcx, а вызывающая функция заботливо положила туда указатель на локальную переменную.
Структура более не возвращается в регистре.

С инлайнигом:
000007FF001837C4  xor         eax,eax  
000007FF001837C6  mov         qword ptr [rsp+20h],rax
Т.к. Vector2 небольшая структура (два флоата - 8 байт), то вся структура помещается в rax. Видно что код не отличается от 1 примера вообще никак.
__________________
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо h1dd3n за это полезное сообщение:
pax (22.08.2016), Randomize (25.08.2016), RegIon (22.08.2016), St_AnGer (22.08.2016), Жека (23.08.2016)