Поскольку все мы знаем, что если мы сравним переменную типа значения с нулем, это приведет к тому, что GC выделит причину для бокса:
{
public class TestGeneric<T>{
public static bool TestGC(T key)
{
return key == null;
}
}
TestGeneric<int>.TestGC(10);
}
Однако я обнаружил, что метод Find (T value) метода LinkedList(System.Collections.Generic) использовал тот же код, что и
public LinkedListNode<T> Find(T value)
{
if (value != null)
{
//....
}
}
Но вызов, подобный
//LinkedList<int> list;
list.Find(10);
, НЕ приведет к выделению GC.
Я действительно смущен этим. У кого-нибудь есть идея? Пожалуйста, помогите. Большое спасибо.
====================
Тестовая среда: Unity 2018, Unity Profiler (Deep ProfileВключить) .Net Версия: 4.0
Вот мой тестовый код.
public class TestGeneric<T> {
public static bool TestGC(T key)
{
return key == null;
}
}
public class LinkedListTest : MonoBehaviour
{
LinkedList<int> list = new LinkedList<int>();
void Start()
{
for (int i = 0; i < 10; ++i)
{
list.AddLast(i);
}
}
void Update()
{
for (int i = 0; i < 10; ++i)
{
TestGeneric<int>.TestGC(10);
}
for (int i = 0; i < 10; ++i)
{
list.Find(100);
}
}
}
Профилировщик единства показывает
Метод TestGC вызвал200Byte GC Alloc на кадр.
list.Find метод вызвал 0Byte GC Alloc на кадр.