Delphi XE2的新功能包含以下内容.
现在打包强制字节对齐记录
如果您的遗留代码使用打包记录类型,并且您想要与外部DLL或C++链接,则需要从代码中删除"packed"一词.packed关键字现在强制字节对齐,而在过去它不一定这样做.行为更改与Delphi 2009中的C++对齐兼容性更改有关.
我不明白这一点.我正在努力解决这一问题:而在过去,它并不一定会这样做.我无法调和的是,压缩总是导致记录的字节对齐,据我所知.任何人都可以给出一个非字节对齐的打包记录的例子吗?显然,这必须是早期版本.
为什么文档说"如果你想与外部DLL或C++链接,你需要删除代码中的单词"?如果外部代码使用了#pragma pack(1)
那么如果打包是非限制我们该怎么办?
$ALIGN
指令怎么样?是{$A1} and {$A-}
相当于packed
或者是有一些额外的意义与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位上产生相同的输出.
文档的最新更新删除了此问题所基于的所有文本.我的结论是原始文本只是一个文档错误.