2011-12-30 37 views
1

我需要獲取任意類型數組的第一個元素的內存地址,該數組存儲爲Object的一種類型。例如,數組可以是一個double []或一個int [],但是在代碼中它將被作爲一個Object輸入。獲取作爲對象存儲的數組的第一個元素的地址

儘管直接獲取已知類型數組的地址,但在C#中不允許獲取對象的地址。有沒有一種類型(除了對象),我可以用來存儲這樣一個數組,並且其內存地址可以更容易地獲得?或者有沒有辦法使用Interop/Reflection直接訪問地址,而無需中間數據複製?

請注意,在下面的第二行中,double []作爲一個對象存儲。並注意在fixed()行中,我試圖獲取o的地址,這在C#中是不允許的。

在此先感謝!

int len=100; 
object o = new double [len]; 

    unsafe 
    { 
       fixed(int*ptr=&o) 
       for (int index = 0; index < len; index++) 
       { 
        // access data directly to copy it, etc... 
       } 

    } 
+1

你爲什麼要這麼做? – 2011-12-30 22:24:04

+0

這並不完全回答這個問題(因此它是一個註釋),但你可以通過聲明一個Array類型的引用並使用Array類來完成你想要的大部分操作(例如'Array.Copy ()'。 – phoog 2011-12-30 22:25:26

+1

@Robert:我想自動執行一些與DirectCompute一起工作的任務,我想用GPU緩衝區綁定CPU結構數組,使用對象自動來回複製數據,並減少冗餘代碼的數量我寫了。可能有更好的方法,我可以使用,而不是不安全的代碼,但現在這會做。 – 2011-12-30 23:01:15

回答

4

可以使用GCHandle實現這一目標:

int len=100; 
object x = new long[len]; 
unsafe 
{ 
    var gch = GCHandle.Alloc(x, GCHandleType.Pinned); 
    try 
    { 
     void* addr = (void*)gch.AddrOfPinnedObject(); 
     // do whatever you want with addr 
    } 
    finally 
    { 
     gch.Free(); 
    } 
} 

只要確保你真的需要這一點。

+0

謝謝!這工作。我討厭在GC中插入物體,但這解決了我的問題。在對@Robert的迴應中,我解釋了我想要做的事情。 – 2011-12-30 23:03:15

相關問題