结构构造函数中的 f# NativePtr.stackalloc
f# NativePtr.stackalloc in Struct Constructor
我正在做一些 F# 性能测试,并试图在堆栈而不是堆上创建一个数组(值与引用类型)。我正在使用 NativePtr.stackalloc 在堆栈上分配内存。在下面的第一个构造函数中出现错误。
type StackArray<'T when 'T : unmanaged> =
struct
val pointer: nativeptr<'T>
new(x) = { pointer = NativePtr.stackalloc x}
new(pointer) = { pointer = pointer}
end
// This give a System.TypeInitializationException with internal System.InvalidProgramException
let ints2 = new StackArray<int>(10)
// This works fine
let (pointer:nativeptr<int>) = NativePtr.stackalloc 10
let ints = new StackArray<int>(pointer)
我可以简单地在函数中使用第二种方法,但我真的很困扰为什么我不能在构造函数中分配内存。
如果您在函数中使用 stackalloc 分配,一旦您返回,分配的堆栈 space 必须被释放(否则您将没有堆栈)
我原以为错误会在稍后使用该对象时发生,但立即出现错误并不完全令人惊讶
我正在做一些 F# 性能测试,并试图在堆栈而不是堆上创建一个数组(值与引用类型)。我正在使用 NativePtr.stackalloc 在堆栈上分配内存。在下面的第一个构造函数中出现错误。
type StackArray<'T when 'T : unmanaged> =
struct
val pointer: nativeptr<'T>
new(x) = { pointer = NativePtr.stackalloc x}
new(pointer) = { pointer = pointer}
end
// This give a System.TypeInitializationException with internal System.InvalidProgramException
let ints2 = new StackArray<int>(10)
// This works fine
let (pointer:nativeptr<int>) = NativePtr.stackalloc 10
let ints = new StackArray<int>(pointer)
我可以简单地在函数中使用第二种方法,但我真的很困扰为什么我不能在构造函数中分配内存。
如果您在函数中使用 stackalloc 分配,一旦您返回,分配的堆栈 space 必须被释放(否则您将没有堆栈)
我原以为错误会在稍后使用该对象时发生,但立即出现错误并不完全令人惊讶