为什么 Vector<T>.Count 是静态的?
Why is Vector<T>.Count static?
我正在尝试使用 System.Numerics.Vector<T>
(documentation)。
我写了一个简单的单元测试:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, v.Count);
但是它给了我一个构建错误:
Member 'Vector.Count' cannot be accessed with an instance reference; qualify it with a type name instead
令我惊讶的是,Vector<T>.Count
是静态的。
所以我尝试了:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, Vector<double>.Count);
现在代码生成但单元测试失败:
Assert.AreEqual failed. Expected:<3>. Actual:<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);
The documentation 表明这是设计使然:
The count of a Vector instance is fixed, but its upper limit is CPU-register dependent.
其目的是允许使用硬件功能进行矢量化操作,因此其容量与您的CPU架构相关。
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
可能会根据 CPU 体系结构而有所不同。
它实际上是非常低级的原语,正如描述所说:
Represents a single vector of a specified numeric type that is
suitable for low-level optimization of parallel algorithms.
我正在尝试使用 System.Numerics.Vector<T>
(documentation)。
我写了一个简单的单元测试:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, v.Count);
但是它给了我一个构建错误:
Member 'Vector.Count' cannot be accessed with an instance reference; qualify it with a type name instead
令我惊讶的是,Vector<T>.Count
是静态的。
所以我尝试了:
var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, Vector<double>.Count);
现在代码生成但单元测试失败:
Assert.AreEqual failed. Expected:<3>. Actual:<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);
The documentation 表明这是设计使然:
The count of a Vector instance is fixed, but its upper limit is CPU-register dependent.
其目的是允许使用硬件功能进行矢量化操作,因此其容量与您的CPU架构相关。
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
可能会根据 CPU 体系结构而有所不同。
它实际上是非常低级的原语,正如描述所说:
Represents a single vector of a specified numeric type that is suitable for low-level optimization of parallel algorithms.