2010-11-23 34 views
3

我一直在試圖獲取有關堆棧陣列在C#不二法門一些信息來分配這種緩衝液是用不安全的代碼stackalloc在C#陣列

char* buffer = stackalloc char[16]; 

作爲一種變通方法,我可以做字符結構。

struct Buffer16 
{ 
    public char c1,c2 //to 16 
} 

有沒有辦法通過創建一個新的類型,以緩衝。在運行時創建。

+2

你確定你需要在棧上分配你的數組嗎? – 2010-11-23 23:05:49

+4

嘗試將C#轉換爲C沒有多大意義。不妨使用C,但這並不妨礙您這樣做。你已經知道這些咒語。 – 2010-11-23 23:16:58

回答

3

您可以將指針總是轉換爲基本類型的指針或結構:

char* buffer = stackalloc char[16]; 
int* i = (int*) buffer; 
long* l = (long*) buffer; 
byte* b = (byte*) buffer; 
Point* p = (Point*) buffer; 

所以你把所有的靈活性。您也可以使用Marshal.PtrToStructure並反向使用,而不使用不安全的代碼。

這是回答您的問題嗎?

1

我不相信有沒有辦法做到這一點,沒有跳過籃球。

C#通常被設計爲阻止對內存資源的微觀管理,並且往往很難將CLR的內存管理器視爲除黑盒外的任何內容。這其中的很大一部分原因是內存管理器通常做得非常好,而當你不顧一切的時候它會做得最好。無論如何,如果將緩衝區放入堆棧而不是堆中,可以獲得真正的性能優勢,通常情況下,我不會感到驚訝。