2

.NET 及其任何运行时(CLR、DLR)是否像Java 一样支持堆外存储?

4

2 回答 2

6

是的,您在这里有两个类似的选择。

最简单的就是制作一个结构数组。当分配结构类型的数组时,每个元素都是实际的结构值,因此数据将连续布局,除了获取特定数组索引所需的取消引用之外,不需要任何取消引用。此技术为您提供类型安全,并且不需要任何特殊权限。数组本身将被垃圾收集。

或者,您可以通过使用类的成员来遵循 Java 示例的精神Marshal

  • AllocHGlobal()将分配一个内存区域。
  • FreeHGlobal()将释放先前的分配。
  • /方法可用于获取和存储数字Read*()Write*()(类似于 Java 示例中使用的get*()/put*()方法。)
  • 重载可用于将Copy()一系列数组元素复制到此内存中或从该内存中复制出来。

我建议使用结构数组方法,除非您有令人信服的理由不这样做。(Java 中需要“不安全”方法,因为 Java 不支持用户定义的值类型。C# 支持。)

如果确实需要使用该Marshal方法,请确保将这些操作封装在实现Dispose 模式的类中。这样消费者可以显式地控制内存分配的生命周期,同时如果消费者没有显式地处理它,仍然允许垃圾收集器释放内存分配。

于 2013-07-26T23:15:56.337 回答
-1

这是对不安全代码的一个不错的解释。C# 不安全代码 我认为这就是您要寻找的,尤其是“stackalloc”。

这允许您在堆栈上分配对象。但是,请注意 C# 中的指针与 C、C++ 中的指针不同。

于 2013-07-26T22:05:15.623 回答