在堆栈上创建固定大小的数组

4
我需要一个固定的数据结构,为了性能考虑它应该在栈上管理,但是它的行为应该像一个数组。
我知道我可以创建这样一个东西:
using System;

namespace X
{
    public sealed struct CustomArray<T>
    {
        private const Int32 n = 2;

        private T _field_1;
        private T _field_2;
        // ...
        private T _field_n;

        public T this[Int32 idx]
        {
            get
            {
                switch(idx)
                {
                    case (0): return _field_1;
                    case (1): return _field_2;
                    // ...
                    case (n): return _field_n;

                    default: throw new IndexOutOfRangeException();
                }
            }
            set
            {
                switch(idx)
                {
                    case (0): _field_1 = value; break;
                    case (1): _field_2 = value; break;
                    // ...
                    case (n): _field_n = value; break;

                    default: throw new IndexOutOfRangeException();
                }
            }
        }
    }
}

但是这种方法对于由约50个元素组成的结构来说并不方便。有没有一种更加方便和易于维护的方法来实现这个呢?

提前感谢。


你确定堆分配的数组会影响应用程序的性能吗?如果你的结构体寿命很短,并且不会再有根引用到你的数组,即使在程序的性能关键部分发生垃圾回收,它也会非常快速。 - JustSomeGuy
我有数十万个在堆上管理的对象,因此我尽可能避免在堆上进行插入/删除操作。 - Benj
2个回答

5

您可以使用 stackalloc 关键字在堆栈中分配数组,看起来这将满足您的堆栈分配需求。不幸的是,它要求您处于不安全的上下文中。

int* block = stackalloc int[100];

太好了。我会将其封装到一个结构体中。非常有帮助。谢谢。 - Benj

1
另一种选择是使用具有命名字段的结构体来声明数据结构,并在堆栈上创建它(类似于本地变量)。如果您需要对堆栈中的数据进行类似数组的访问,可以尝试以下方法:
[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public unsafe struct DataStructure
{
    [FieldOffset(0)]public fixed ushort[8];

    [FieldOffset(0)]public ushort wYear; 
    [FieldOffset(2)]public ushort wMonth;
    [FieldOffset(4)]public ushort wDayOfWeek; 
    [FieldOffset(6)]public ushort wDay; 
    [FieldOffset(8)]public ushort wHour; 
    [FieldOffset(10)]public ushort wMinute; 
    [FieldOffset(12)]public ushort wSecond; 
    [FieldOffset(14)]public ushort wMilliseconds; 
}

然后你可以这样引用它:
private static unsafe void Main(string[] args)
{
    DataStructure ds;

    ds.wYear = 2015;
    ds.wMonth = 04;

    ds.array[0] = 2014;
    ds.array[1] = 05;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接