F# NativePtr.stackalloc в конструкторе структур
Я провожу тестирование производительности 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)
Я мог бы просто использовать второй метод в функции, но меня действительно беспокоит, почему я не могу выделить память внутри конструктора.
1 ответ
Решение
Если вы выделяете с помощью stackalloc в функции, после того как вы вернетесь, выделенное пространство стека должно быть освобождено (иначе у вас не будет стека)
Я ожидал, что ошибка произошла позже, когда объект был использован, но ошибка сразу не вызывает удивления.