【发布时间】:2021-12-25 02:46:05
【问题描述】:
.NET6/C# 引入了NativeMemory 类,但我没有得到什么时候应该使用NativeMemory.Alloc() 而不是普通的数组实例化(new T[])。我的问题是:
-
NativeMemory.Alloc()在内存的哪个区域填充对象?该方法是否填充托管堆中的对象? -
在什么情况下我们应该用
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 等本机语言编写的代码。这种情况很少见,您会在需要时知道。