【问题标题】:stackalloc of arrays in C#C#中数组的stackalloc
【发布时间】:2011-05-14 19:08:33
【问题描述】:

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

char* buffer = stackalloc char[16];

作为一种解决方法,我可以制作一个字符结构。

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

有没有办法通过创建新类型来制作缓冲区。在运行时创建。

【问题讨论】:

  • 您确定需要在堆栈上分配您的数组吗?
  • 尝试将 C# 转换为 C 并没有多大意义。不妨使用 C。但这并不能阻止您这样做。你已经知道咒语了。
  • BTW:C# 中的 char 表示 Unicode 字符。表示 8 位无符号整数的数据类型称为 byte
  • .NET 中引用类型的分配平均来说相当便宜,因为堆在收集期间被压缩。无需担心临时对象甚至临时缓冲区;这很少会成为您的瓶颈。
  • @Hans stackalloc 非常棒,因为您不必担心 GC 和 pinning。这是我会使用的原因之一,它对于指针操作来说很快。

标签: c# .net stack


【解决方案1】:

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

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

所以你拥有所有的灵活性。您也可以使用Marshal.PtrToStructure 并在不使用不安全代码的情况下进行反向操作。

这能回答你的问题吗?

【讨论】:

  • 我知道不安全但我不想使用它。例如我不能在 WP7 CF 上。感谢您提供有关投射的提示,不知道。
【解决方案2】:

我不相信有一种方法可以做到这一点,而无需跳过箍。

C# 通常被设计成不鼓励对内存资源进行微管理,并且往往会竭尽全力使 CLR 的内存管理器难以被视为黑匣子。造成这种情况的很大一部分原因是内存管理器通常做得很好,并且在您不妨碍它时做得最好。无论如何,如果将缓冲区放入堆栈而不是堆中并没有获得真正的性能优势,这通常已经足够了,我不会感到惊讶。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2020-08-06
    相关资源
    最近更新 更多