22.08.2016, 21:16
|
#12
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Decompiled Unity5.3 (c#)
Сообщение от h1dd3n
Добавлю
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)
|
|