引用块:
Packed Now Forces Byte Alignment of Records
如果您有使用打包记录类型的遗留代码,并且要链接到外部DLL或C++,则需要从代码中删除"packed"单词。现在,打包关键字会强制执行字节对齐,而过去并不一定如此。该行为更改与Delphi 2009中的C++对齐兼容性更改相关。
我不理解这句话。我困扰于这一点:而以前它并不一定是这样的。据我所知,打包始终导致记录的字节对齐。有人能给出一个打包的记录不是按字节对齐的例子吗?显然,这必须在早期版本中实现。为什么文档中说“如果您想使用外部DLL或C++链接,您需要从代码中删除packed一词”?如果外部代码使用#pragma pack(1),那么如果不允许使用packed,我们该怎么办? $ALIGN指令呢?{$A1}和{$A-}是否相当于packed,还是有额外的含义?
似乎我缺少一些东西,如果有人能解释一下就好了。或者文档真的很差吗?
更新
我相当确信文档指的是记录本身的对齐而不是记录的布局。下面是一个小程序,显示使用packed在记录上强制进行对齐时,记录的对齐方式为1。
program PackedRecords;
{$APPTYPE CONSOLE}
type
TPackedRecord = packed record
I: Int64;
end;
TPackedContainer = record
B: Byte;
R: TPackedRecord;
end;
TRecord = record
I: Int64;
end;
TContainer = record
B: Byte;
R: TRecord;
end;
var
pc: TPackedContainer;
c: TContainer;
begin
Writeln(NativeInt(@pc.R)-NativeInt(@pc.B));//outputs 1
Writeln(NativeInt(@c.R)-NativeInt(@c.B));//outputs 8
Readln;
end.
这在 Delphi 6、2010、XE 和 XE2 的 32 位版本以及 XE 的 64 位版本上产生相同的输出。