gpt4 book ai didi

Delphi 7 与 2009(和 2010)相比记录大小

转载 作者:行者123 更新时间:2023-12-03 14:44:53 28 4
gpt4 key购买 nike

在将代码从 Delphi 7 转换到 2010 时,我遇到了一个奇怪的问题。它与记录有关。下面定义的记录在 D7 中调整大小时为 432 字节,在 D2009(和 2010)中为 496 字节。我知道,一个简单的解决方案是使其成为打包记录,然后所有版本都为 426 字节...但是,我们在流式传输记录的位置存储了数据,现在我们正在尝试使用更新的语言读取这些流。

TToTry = Record
a,b,c,d : Extended;
e,f,g,h : Extended;
i : String[15];
j,k,l,m,n,o,p,q,r,s,t : Array[1..3] of Extended; End;

在调查此问题时,我创建了另一条记录,但出于某种原因,大小是相同的?记录较小,但具有相同的数据类型。但在该语言的所有版本中它的大小都是相同的。

TMyRecord = Record
Ext1 : Extended;
Ext2 : Extended;
Ext3 : Extended;
Ext4 : Extended;
Ext5 : Extended;
Ext6 : Extended;
Int1 : Integer;
Int2 : Integer;
char1 : AnsiChar;
char2 : AnsiChar;
MyString : String[15];
Arr1 : Array[1..3] of Extended;
Arr2 : Array[1..3] of Extended; end;

有人知道为什么一张记录如此不同,而另一张记录却相同吗?肯定与 Delphi 中的字节边界对齐有关。但是从一个版本到下一个版本发生了如此巨大的变化是什么?

最佳答案

嗯,第一个问题是您将非打包记录存储到磁盘。字段和数组封装允许在产品版本之间进行更改,因为通常内存中的布局在进程外部不可见。你违反了这条规则。

如果字节填充默认值在 Delphi 7 和 Delphi 2009 之间发生了变化,请找出 D7 中的默认值,并在 Delphi 2009 中将默认值设置为相同的值。

还要检查数组打包默认值。我不记得是否有单独的设置。

在 Delphi 2009 的调试内存 View 中查看记录结构。部分或全部额外大小可能是由于记录本身(而不是其中的字段)的填充造成的,因此当在数组中使用记录时,数组元素位于快速机器边界上。

如果这些都没有帮助,请在 D2009 中创建临时打包记录类型,并在实际数据字段之间手动插入字节填充字段,直到记录大小和字段对齐方式与 D7 布局匹配。这不仅仅是大小,还有字段对齐。使用此临时打包记录读取旧数据文件。然后将数据逐字段传输到 D2009 中的“真实”记录类型中,并写出一个新文件。

当您执行此操作时,将该记录类型打包到 D2009 中,这样就不会再发生这种情况。

关于Delphi 7 与 2009(和 2010)相比记录大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3206409/

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