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 в функции, после того как вы вернетесь, выделенное пространство стека должно быть освобождено (иначе у вас не будет стека)

Я ожидал, что ошибка произошла позже, когда объект был использован, но ошибка сразу не вызывает удивления.

Другие вопросы по тегам