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

Сообщение от Жека Посмотреть сообщение
Все предустановленные направления вектора реализованы так:
public static Vector2 zero
        
{
            
get
            
{
                return new 
Vector2(0f0f);
            }
        }
        public static 
Vector2 one
        
{
            
get
            
{
                return new 
Vector2(1f1f);
            }
        } 
Каждый раз создаётся новый вектор. Наверное для стэковой памяти это не затратно.
Хотя я читал, что при присвоении типа struct в переменную создается копия. Получается, тут будет дважды создана копия:
var Vector2.one
Или нет?
Нет, не будет.
Все правильно читал - значимые типы в дотнете "копируются" при присвоении. Однако в приведенном тобой примере есть только 1 присвоение. Есть 2 причины почему здесь не будет "двойного" копирования.

Причина 1:

Есть код
var vector = new Vector3(1, 2, 3);
В этом месте будет сгенерирован такой код что значения 1, 2 и 3 будут тупо инструкцией mov скопированы на соответствующие участки памяти на стеке (то есть в переменную vector)

Другой код
var vector = Vector3.Zero;

...

public static Vector3 Zero {
get {
return new Vector3(1, 2, 3);
}
}
В этом коде надо сначала создать вектор а потом "вернуть" его. Но дважды ничего копировать не придется и вот почему: вызывающая функция знает что возвращенное значение придется куда-то сохранить, поэтому она передает методу (а геттер это просто метод, на самом деле) аргумент (в каком-то из регистров) - указатель на локальную переменную vector то есть куда именно геттеру надо записать "созданный" вектор. То есть метод сразу пишет куда надо и только 1 раз. Это первая причина почему "двойного" копирования нет.

Причина 2:
Из-за того что геттер Vector3.Zero довольно простой и мал в размере, он 99% будет заинлайнен, так что
var vector = new Vector(0, 0, 0);
и
var vector = Vector3.Zero;
это одно и тоже.
__________________
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо h1dd3n за это полезное сообщение:
pax (22.08.2016), Randomize (25.08.2016), RegIon (22.08.2016), St_AnGer (22.08.2016), Taugeshtu (22.08.2016), Жека (23.08.2016)