2

是否有以下手动修复的替代方法:

// excerpt adapted from SIMDTest in   
// http://www.mccauslandcenter.sc.edu/mricro/obsolete/graphics/simdtest.zip
//
var
  lAdblRAp, lArraySz, lAdblRA, Doublep: LongInt;
begin
  // ...
  GetMem(lAdblRAp,(lArraySz * SizeOf(Double)) + 32);
  lAdblRA := Doublep((Integer(lAdblRAp) and $FFFFFFF0) + 16);
  // ...
end;

请注意,这段代码嵌入在过程或函数中。

4

2 回答 2

3

标准方法是使用内存管理器,它将在 16 字节边界上对齐块。FastMM 将执行此操作,但您需要完整版本才能配置此选项。

另请注意,您问题中的代码未准备好 64 位,因为它将指针转换为 4 字节整数。

于 2012-02-23T08:08:31.877 回答
2

如果您使用的是新版本的 Delphi(我已经用 XE 和 XE2 进行了测试),最好和最简单的方法是SetMinimumBlockAlignment(mba16Byte)在代码的第一个位置调用。

然后调用常规GetMemNew任何内存分配函数并确保地址与 16 字节边界对齐

编辑:

此外,如果您更喜欢使用手动修复,那么浪费更少内存的最佳有效方法如下:

var
  lArraySz: LongInt;
  lAdblRAp, lAdblRA: Pointer;     

begin
  // ...
  GetMem(lAdblRAp,(lArraySz * SizeOf(Double)) + 16);
  lAdblRA := Pointer((Integer(lAdblRAp) + 15) and $FFFFFFF0));
  // ...
end;

每次分配都会少用 16 个字节。

于 2012-02-23T10:49:05.093 回答