.NET 及其任何运行时(CLR、DLR)是否像Java 一样支持堆外存储?
问问题
1414 次
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 回答