2013-12-11 37 views
9

在C中,我可以定義一個指針到一個這樣的數組:在不安全的C#使用指針陣列

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

使得b3[i][j] == b1[i*3+j]

我可以在C#中聲明這樣一個指針,b3,在unsafe

我的目的是訪問位渠道:

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

我希望通過這種方式,使用source[x][ch]代替source[x*3+ch]得到一些編譯器優化。

+0

希望基於優化沒有任何意義真。您可以製作一個指針'byte * []',但它可能不是您想要的 - [查看文檔](http://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx)。 – BartoszKP

+0

@BartoszKP也許你是對的,我可能是過度優化!我的觀點是,在C/C++中,良好的聲明通常對較重的代碼提供更好的性能(和易讀性),因爲編譯器可以優化前者而不是後者。 –

+0

在C#[this](http://stackoverflow.com/a/1563170/2642204)中,推薦使用位圖處理性能。 – BartoszKP

回答

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); 
      } 
     } 
    } 
} 

}

這應該是幾乎相同的,你有什麼。請注意,我不期望任何性能提升。這不是微型優化,而是納米優化。

如果處理的巨大圖像,考慮並行編程& SSE和高速緩存行是如何工作的(他們確實爲我節省3-4秒 - 瘋了吧?!)

+0

謝謝,但這就是我實際使用的。我正在尋找一個數組指針,所以我甚至不需要定義一個結構。 –

+0

關於優化增益:我將'b1 [x * 3 + ch]'與fastpixel [x] .R'進行比較來檢查... –