为什么Vector <t> .Count是静态的?

时间:2016-02-11 15:39:51

标签: .net system.numerics

我尝试使用System.Numerics.Vector<T>documentation)。

我写了一个简单的单元测试:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, v.Count);

但它给了我一个构建错误:

  

会员&#39; Vector.Count&#39;无法使用实例引用访问;使用类型名称来限定它

令我惊讶的是,Vector<T>.Count是静态的。

所以我试过了:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, Vector<double>.Count);

现在代码构建但单元测试失败:

  

Assert.AreEqual失败。预期:其中3。实际:&LT 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 个答案:

答案 0 :(得分:4)

The documentation表明这是设计原因:

  

Vector实例的计数是固定的,但其上限取决于CPU寄存器。

其目的是允许使用硬件功能进行矢量化操作,因此其容量与CPU的架构相关联。

答案 1 :(得分: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可能因CPU架构而异。

它实际上是非常低级的原语,如描述所示:

  

表示指定数字类型的单个向量   适用于并行算法的低级优化。