2013-12-11 18 views
9

W C, można określić wskaźnik na tablicę jak poniżej:Stosując wskaźnik do tablicy w niebezpiecznym C#

char b1[SOME_SIZE]; 
char (*b3)[3]=(char(*)[3])b1; 

tak, że b3[i][j] == b1[i*3+j].

Czy mogę zadeklarować taki wskaźnik, b3, w unsafe C#?

Moją intencją jest, aby dostęp do kanałów bitmap jako:

///... 
unsafe { 
    //... 
    byte *target; //8bpp 
    byte (*source)[3]; //24bpp 
    //... 
    target[x]=(source[x][0]+source[x][1]+source[x][2])/3; 
    //... 

mam nadzieję w ten sposób, przy użyciu source[x][ch] zamiast source[x*3+ch] trochę optymalizacji kompilatora.

+0

optymalizacja Nadzieja na bazie nie ma żadnego sensu naprawdę. Możesz utworzyć wskaźnik 'byte * []', ale prawdopodobnie nie jest to coś, co masz zamiar mieć - [zobacz w dokumentach] (http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx). – BartoszKP

+0

@BartoszKP Może masz rację, prawdopodobnie nadmiernie optymalizuję! Chodzi mi o to, że w języku C/C++ dobrze wykonane deklaracje dają często lepszą wydajność (i czytelność) w stosunku do ciężkiego kodu, ponieważ kompilator może zoptymalizować poprzednie, ale nie drugie. –

+0

W języku C# [this] (http://stackoverflow.com/a/1563170/2642204) jest zalecanym sposobem pracy z bitmapami pod względem wydajności. – BartoszKP

Odpowiedz

5
[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct FastPixel 
{ 
    public readonly byte R; 
    public readonly byte G; 
    public readonly byte B; 
} 


private static void Main() 
{ 
    unsafe 
    { 
     // 8-bit. 
     byte[] b1 = 
     { 
      0x1, 0x2, 0x3, 
      0x6, 0x7, 0x8, 
      0x12, 0x13, 0x14 
     }; 


     fixed (byte* buffer = b1) 
     { 
      var fastPixel = (FastPixel*) buffer; 
      var pixelSize = Marshal.SizeOf(typeof (FastPixel)); 

      var bufferLength = b1.Length/pixelSize; 
      for (var i = 0; i < bufferLength; i++) 
      { 
       Console.WriteLine("AVERAGE {0}", (fastPixel[i].R + fastPixel[i].G + fastPixel[i].B)/pixelSize); 
      } 
     } 
    } 
} 

}

ta powinna być prawie identyczne, co masz. Zwróć uwagę, że nie oczekuję żadnych wzrostów wydajności. To nie jest mikro-optymalizacja, to nano-optymalizacja.

Jeśli do czynienia z ogromnymi obrazami, zajrzeć do programowania równoległego & SSE i jak działają linie cache (one zapisane mnie faktycznie 3-4 sekund - szalona prawda ?!)

+0

Dzięki, ale właśnie tego używam. Szukam wskaźnika tablicy, więc nie potrzebuję nawet definiować struktury. –

+0

O wzmocnieniu optymalizacji: Będę porównywać "b1 [x * 3 + ch]" z 'fastpixel [x] .R', aby sprawdzić ... –