Delphi数组对齐设置为4,8或16字节边界?

Bru*_*uce 2 arrays delphi alignment

我想使用Delphi 2009的FFTW C库并根据本文档;

http://www.fftw.org/install/fftw_usage_from_delphi.txt

为了提高FFTW库内的性能(使其可以使用SIMD扩展),传入Single(float)或Double(double)的数组需要在4或8字节边界对齐.我找到了关于记录结构对齐的文档,但没有关于数组的具体内容.在Delphi 2009中有没有办法做到这一点.

所以代码(从上面的文档中复制)看起来像这样;

var
      in, out : Array of Single; // Array aligned at 4 byte boundary
      plan : Pointer;

    {$APPTYPE CONSOLE}

    begin

      ...  

      SetLength(in, N);
      SetLength(out, N);

      plan := _fftwf_plan_dft_1d(dataLength, @in[0], @out[0],
                                 FFTW_FORWARD, FFTW_ESTIMATE);
Run Code Online (Sandbox Code Playgroud)

同样在上面的文档中,他们讨论了8和16字节的边界,但它看起来它应该是4和8字节边界,如果有任何可以清除,那将是伟大的.

谢谢,布鲁斯

mgh*_*hie 6

请注意,您可以使用可能需要的任何自定义对齐方式创建数据结构.例如,在128字节边界上对齐FFT数据:

procedure TForm1.Button1Click(Sender: TObject);
type
  TFFTData = array[0..63535] of double;
  PFFTData = ^TFFTData;
var
  Buffer: pointer;
  FFTDataPtr: PFFTData;
  i: integer;
const
  Alignment = 128; // needs to be power of 2
begin
  GetMem(Buffer, SizeOf(TFFTData) + Alignment);
  try
    FFTDataPtr := PFFTData((LongWord(Buffer) + Alignment - 1)
                           and not (Alignment - 1));

    // use data...
    for i := Low(TFFTData) to High(TFFTData) do
      FFTDataPtr[i] := i * pi;

  finally
    FreeMem(Buffer);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

编辑:

关于分配内存两倍的注释:堆栈变量FFTData的类型为PFFTData,而不是TFFTData,因此它是一个指针.这并不是那么明显,因为语法增强允许省略^以取消引用指针.内存使用GetMem()进行分配,并使用正确的类型而不是无类型的内存块来使用类型转换.我应该称之为FFTDataPtr.