【问题标题】:When should we use NativeMemory.Alloc() in .NET? [closed]我们什么时候应该在 .NET 中使用 NativeMemory.Alloc()? [关闭]
【发布时间】:2021-12-25 02:46:05
【问题描述】:

.NET6/C# 引入了NativeMemory 类,但我没有得到什么时候应该使用NativeMemory.Alloc() 而不是普通的数组实例化(new T[])。我的问题是:

  1. NativeMemory.Alloc() 在内存的哪个区域填充对象?该方法是否填充托管堆中的对象?

  2. 在什么情况下我们应该用NativeMemory.Alloc()代表new T[]

参考: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.nativememory?view=net-6.0

【问题讨论】:

  • 只是一个猜测:我认为他们添加它是为了拥有一个更加独立于操作系统的 API,用于分配/释放与 P/Invoke 调用一起使用的本机内存。之前我们已经有了Marshal.AllocHGlobal()Marshal.FreeHGlobal(),但是这些都是以对应的WinApi函数命名的,并不真正适合独立于操作系统的框架。
  • History is here,他们创造了一种新的类型,以摆脱使用 IntPtr 的 Marshal 类的做法。 void* 返回迫使程序员在他们的代码中使用unsafe。其他方面的用法是相同的,您将分配本机内存以传递给以 C 等本机语言编写的代码。这种情况很少见,您会在需要时知道。

标签: c# .net-6.0


【解决方案1】:

看起来它是“C malloc API 上的瘦包装器”。所以如果我没记错的话,它会在非托管堆上分配内存。

至于第二个问题,我真的想不出在 .NET 中有用的任何特定场景(除了一些边缘情况)(尽管我确信它们存在)正在使用 C/C++。尽管如此,我想人们会在速度绝对是最重要的地方使用它(例如渲染)。

它刚刚被添加,以便我们可以选择使用 C/C++ 之类的内存管理。

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2012-12-23
    • 2021-07-13
    • 2010-09-05
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多