Почему 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 может варьироваться в зависимости от архитектуры процессора.

На самом деле это довольно низкоуровневый примитив, как говорится в описании:

Представляет один вектор указанного числового типа, который подходит для низкоуровневой оптимизации параллельных алгоритмов.

Другие вопросы по тегам