Почему Vector<T>.Count статичен?
Я пытаюсь использовать System.Numerics.Vector<T>
( документация).
Я написал простой модульный тест:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, v.Count);
Но это дало мне ошибку сборки:
Член 'Vector.Count' не может быть доступен со ссылкой на экземпляр; вместо этого укажите имя типа
К моему удивлению, Vector<T>.Count
статичен
Итак, я попробовал:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, Vector<double>.Count);
Теперь код строится, но модульный тест не проходит:
Assert.AreEqual не удалось. Ожидаемое:<3>. Фактическое:<2>.
В чем дело?
Расследуя я обнаружил:
Assert.AreEqual(2, Vector<double>.Count);
Assert.AreEqual(4, Vector<float>.Count);
Assert.AreEqual(4, Vector<int>.Count);
Assert.AreEqual(2, Vector<long>.Count);
2 ответа
Документация предполагает, что это по замыслу:
Счетчик экземпляра Vector фиксирован, но его верхний предел зависит от регистра ЦП.
Его цель - разрешить векторизацию операций с использованием аппаратных возможностей, и, следовательно, его емкость связана с архитектурой вашего процессора.
Вектор может быть несколько запутанным типом. Это фиксированная коллекция предопределенной длины. Это исправлено, потому что его длина всегда == Vector<T>.Count
, Так что если вы делаете:
var v = new Vector<double>(new double[] { 12, 13, 14 });
Console.WriteLine(v);
результат...:
<12, 13>
Это просто отбрасывает все значения Vector<double>.Count
что бывает 2. Хитрость в том, что Vector<T>.Count
может варьироваться в зависимости от архитектуры процессора.
На самом деле это довольно низкоуровневый примитив, как говорится в описании:
Представляет один вектор указанного числового типа, который подходит для низкоуровневой оптимизации параллельных алгоритмов.