【发布时间】:2012-01-17 15:40:04
【问题描述】:
Delphi XE2 的新增功能包含 following。
Packed Now 强制记录的字节对齐
如果您有使用打包记录类型的旧代码并且您希望 要与外部 DLL 或 C++ 链接,您需要删除单词 从您的代码中“打包”。 packed 关键字现在强制字节对齐, 而在过去,它不一定会这样做。行为 更改与 Delphi 中的 C++ 对齐兼容性更改有关 2009.
我不明白这一点。我正在为这一点苦苦挣扎:而在过去,它不一定会这样做。我无法调和的是,据我所知,packed 总是导致记录的字节对齐。谁能举一个非字节对齐的打包记录的例子?显然,这必须是早期版本。
为什么文档说“如果你想与外部 DLL 或 C++ 链接,你需要从你的代码中删除打包这个词”?如果外部代码使用#pragma pack(1),那么如果packed是禁区怎么办?
$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 位上产生相同的输出。
【问题讨论】:
-
请记住,有两种对齐方式在起作用:记录中字段的对齐方式(这是打包的影响)和记录本身的对齐方式,例如,在这些记录的数组中.从历史上看,我相信打包并不会影响记录本身的对齐方式,后来改变了,或者反过来。
-
绝望的谷歌搜索揭示了你的问题和它提到的文章。我也不明白,我只是举个例子。打包记录中的未打包数组,或者可能是变体记录?目前在我的 linux 机器上,否则我会对实验产生足够的兴趣。
-
@dthorpe 嗨,丹尼。我知道布局和对齐之间的区别。现在的 Delphi 文档记录了打包记录的对齐方式为 1。但我的经验是,这一直是这样。在 D6 中肯定是这种情况。所以打包确实会影响布局和对齐。你是说如果你走得足够远,即 D1 说,那只包装受影响的布局?
-
我记得这是 Kylix 中的一个问题,需要进行大量内部讨论,但我不记得事情进展的细节。
标签: delphi delphi-xe2