Delphi не предоставляет возможности управлять выравниванием любой памяти, которую она выделяет. Вам остается либо полагаться на документированное поведение установленного в данный момент менеджера памяти, либо выделять память с небольшим свободным пространством, а затем выравнивать ее самостоятельно, , как показывает Mghie .
Если вы обеспокоены тем, что диспетчер памяти Delphi не обеспечивает желаемого выравнивания для динамических массивов, тогда вы можете пойти дальше и использовать функции памяти, предоставляемые DLL. В цитируемой вами заметке упоминаются _fftwf_malloc
и _fftwf_free
, но затем она дает какое-то предупреждение о том, что память, выделенная из _fftwf_malloc
, "не может быть доступна напрямую из Delphi". Это не может быть тем, что хотели сказать авторы, потому что это не то, как работает память в Windows. Авторы, вероятно, хотели сказать, что память, выделенная _fftwf_malloc
, не может быть освобождена Delphi FreeMem
, а память, выделенная Delphi GetMem
, не может быть освобождена _fftwf_free
. В этом нет ничего особенного; вам всегда необходимо поддерживать сопряжение функций управления памятью.
Если вы используете _fftwf_malloc
для получения массива, вы можете получить к нему доступ через обычный тип указателя. Например:
var
dataIn, dataOut: PDouble;
begin
dataIn := _fftwf_malloc(...);
dataOut := _fftwf_malloc(...);
_fftwf_plan_dft_1d(dataLength, dataIn, dataOut,
FFTW_FORWARD, FFTW_ESTIMATE);
Начиная с Delphi 2009, вы даже можете использовать синтаксис массива для этих указателей:
dataIn[0] := 3.5;
dataIn[2] := 7.3;
Чтобы включить это, используйте директиву компилятора {$POINTERMATH ON}
; он не включен по умолчанию, за исключением типов символьных указателей.
Недостатком ручного распределения массивов, как это, является то, что вы теряете проверку диапазона. Если вы индексируете за концом массива, вы больше не получите легко распознаваемое исключение ERangeError
. Вместо этого вы получите поврежденную память, нарушения прав доступа или загадочные сбойные программы.