gpt4 book ai didi

delphi - "Packed Now Forces Byte Alignment of Records"是什么意思?

转载 作者:行者123 更新时间:2023-12-03 14:34:31 26 4
gpt4 key购买 nike

Delphi XE2 的新增功能包含 following .

Packed Now Forces Byte Alignment of Records

If you have legacy code that uses the packed record type and you want to link with an external DLL or with C++, you need to remove the word "packed" from your code. The packed keyword now forces byte alignment, whereas in the past it did not necessarily do this. The behavior change is related to C++ alignment compatibility changes in Delphi 2009.

我不明白这个。我正在努力解决这一点:而在过去它不一定这样做。据我所知,我无法调和的是,packed 总是导致记录的字节对齐。任何人都可以举一个未字节对齐的打包记录的示例吗?显然这必须是早期版本。

为什么文档说“如果您想与外部 DLL 或 C++ 链接,您需要从代码中删除“packed”一词”?如果外部代码使用#pragma pack(1)那么如果packed不受限制我们该怎么办?

$ALIGN 指令怎么样? {$A1} 和 {$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 位上产生相同的输出。

最佳答案

文档的最新更新已删除了该问题所基于的所有文本。我的结论是,原文只是一个文档错误。

关于delphi - "Packed Now Forces Byte Alignment of Records"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com