2013-12-11 17 views
9

の配列へのポインタを使用して、私はこのような配列へのポインタを定義することができる:Cで安全でないC#

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

b3[i][j] == b1[i*3+j]ようになっています。

このようなポインタb3unsafe C#で宣言できますか?

私の意図として、ビットマップチャンネルにアクセスすることです:私はいくつかのコンパイラの最適化を得るために、代わりにsource[x*3+ch]source[x][ch]を使用して、このように願っています

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

+0

ホープ・ベースの最適化はどんな意味がありません。本当に。あなたは 'byte * [] 'というポインタを作ることができますが、それはおそらくあなたが持っているつもりではないでしょう - [docsで見る](http://msdn.microsoft.com/en-us/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'に対してベンチマークして確認します。 –

関連する問題