C#中的数组堆栈分配

3

我一直在尝试获取关于C#中堆栈数组的信息,而分配此类缓冲区的唯一方法是使用不安全代码

char* buffer = stackalloc char[16];

作为一种解决方法,我可以创建一个字符结构。
struct Buffer16
{
   public char c1,c2 //to 16
}

有没有一种方法可以使缓冲区不通过创建新类型来实现。在运行时创建。

2
你确定需要在栈上分配数组吗? - Albin Sunnanbo
4
将C#转化为C并没有太多意义,还不如直接使用C。但这并不能阻止你这么做。毕竟你已经知道了相关的方法和技巧。 - Hans Passant
2
顺便提一下:在C#中,char代表一个Unicode字符。表示8位无符号整数的数据类型称为byte - dtb
4
在.NET中,引用类型的分配通常是相当廉价的,因为堆在垃圾收集期间是压缩的。不需要担心临时对象甚至临时缓冲区;这很少成为瓶颈。 - Dan Bryant
1
@Hans,stackalloc非常棒,因为你不必担心GC和固定。这就是我会使用它的原因之一,而且对于指针操作来说速度非常快。 - Aliostad
显示剩余2条评论
2个回答

3

您可以将指针转换为原始类型指针或结构体:

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

那么你拥有所有的灵活性。你还可以使用 Marshal.PtrToStructure 来进行反向操作,而无需使用不安全的代码。

这个回答了你的问题吗?


我知道unsafe关键字,但我不想使用它。例如,在WP7 CF上我不能使用它。感谢您提供转换的提示,我之前并不知道。 - Lukasz Madon

1

我不相信有一种方法可以轻松地完成它。

C#通常旨在防止对内存资源进行微观管理,并且往往会费尽心思,使CLR的内存管理器成为除黑盒外的任何东西。这样做的一个重要原因是内存管理器通常非常出色,当您不干扰它时,它会发挥最佳效果。总的来说,我不会感到惊讶,如果将缓冲区放入堆栈而不是堆中,实际上并没有真正的性能优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接