2015-03-04 2 views
2

мне нужна фиксированная структура данных, которая (по соображениям производительности) управляются на стеке, но ведет себя как массивСоздание массива фиксированного размера на стек

Я знаю, что я могу создать что-то вроде этого:

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 элементов. есть ли способ достичь этого более удобным и удобным образом?

благодаря вперед

+0

Вы уверены, что кучи выделяется массив будет снижать производительность вашей заявки? Если ваша 'struct' имеет короткий срок службы и больше не будет корней для вашего массива, GC, даже если это произойдет в критическом для производительности разделе вашей программы, будет очень быстрым. – Spo1ler

+0

У меня есть сотни тысяч объектов, управляемых в куче, поэтому я стараюсь избегать операций вставки/удаления на куче как можно больше – Benj

ответ

2

Вы можете выделить массив в стеке, используя ключевое слово stackalloc, кажется, что она будет удовлетворять ваши потребности распределения стеки. К сожалению, это требует, чтобы вы были в небезопасном контексте.

int* block = stackalloc int[100]; 
+0

. превратит это в структуру. большая помощь. благодаря – 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; 
} 
Смежные вопросы