10

有没有在 .NET 中实现不需要不安全代码的固定大小数组的好方法?

我的目标是创建一个值类型,它代表一个固定大小的数组,该数组可以嵌入(作为成员包含)在其他类型中 - 即我特别希望避免将数组创建为声明它的类型的单独对象.

我意识到 .NET 的数组实现非常出色,并且在 CLR/CIL 级别得到了支持——并且真的不想争论是否只使用数组......这里的探索是关于是否安全、固定大小,值类型的实现几乎同样有效。

4

2 回答 2

5

目标是能够拥有一个固定大小的值类型数组,该数组可以用作其他类型的私有成员。考虑一个自定义字典或链表实现......如果每个桶/节点被展平以包含它自己的固定大小数组,则可以减少堆分配的数量。

使您的数组成为值类型并不一定意味着它将存储在堆栈中。事实上,如果它是嵌入在引用类型中的值类型,它很可能会与引用类型一起存储在堆上,而不是堆栈上。

因此,将其设为值类型根本不会减少堆分配。

更多信息在这里:链接

于 2010-11-03T04:30:30.373 回答
2

在使用反射器进行一些研究之后,事实证明以下代表了一个可接受的(性能方面)解决方案,因为 C# 将针对整数的 switch 语句编译为 CIL switch 语句,该语句被实现为跳转列表......即 - getter 在大约 11 个 CIL 指令中执行,这很好。

 public struct EmbeddedArray<T>
    {
        private T _element0;
        private T _element1;
        private T _element2;

        public int Length { get { return 3; } }


        public T this[int index]
        {
            get
            {
                switch (index)
                {
                    case 0:
                        return _element0;
                    case 1:
                        return _element1;
                    case 2:
                        return _element2;
                }
                throw new ArgumentOutOfRangeException("index");

            }
        }
    }

请参阅下面的 Hans 评论。事实证明,这并不像我希望的那样性能......一旦 CIL 被编译为本机机器代码,测量的性能与 .NET 数组将产生的性能相差甚远。

于 2010-11-03T07:27:47.810 回答