Структуры, безусловно. Зачем? Ну, это отчасти чувство, я думаю, вектор просто чувствует и ведет себя как значение .
Rico Mariani здесь приводит некоторые причины, по которым типы значений были выбраны для определенных типов для API (я не думаю, что речь идет о XNA).
И хотя здесь фактор эффективности, я не думаю, что речь идет о сборке мусора, а о плотности данных , как говорит Рико. Скажем, у вас также есть тип Vertex
, который содержит два Vector3
s: a Vector3
для нормалей и Vector3
для мировых координат. Если вы создали классы этих типов, то массив из 100 Vertex
элементов будет состоять из:
- 100 * 8 байт (я полагаю, 8 байтов - это издержки класса в памяти, 4 байта для заголовка типа и 4 байта для чего-то еще, дескриптор GC?)
- 100 * 4 байта (для указателей в массиве на элементы
Vertex
)
- 200 * 4 байта (для указателей от каждого
Vertex
на два Vector3
элемента)
- 200 * 8 байт (для 8-байтовых служебных данных, которые вы платите за создание
Vector3
класса)
- 200 * 12 байтов (для фактической полезной нагрузки 3
float
на Vector3
)
6000 байт (в 32-битной системе).
Как тип значения, это просто 200 * 12 байт = 2400 байт. Гораздо эффективнее в пространстве, не говоря уже о более низком уровне косвенности при чтении массива.
Но занятие большого пространства не обязательно делает его медленным, неправильно использовать тип значения может быть медленнее, чем сделать его классом, как Я обнаружил . Вы определенно хотите передать их как можно больше ref
, избегайте их копирования, но это не относится к всем операциям, так что измерьте. Я думаю, что я помню, что вычисление точечного произведения было медленнее при прохождении ref
, возможно, потому, что оно каким-то образом предотвращало встраивание, увеличивая IL. Но не верьте мне на слово, просто измерьте.