动态结构的大小
|
(希望)这将很快得到解决,这是我的问题:
我有一个结构
PMacro = ^TMacro;
TMacro = class
Hotkey: Integer;
Command: String;
CTRLMode: boolean;
RepeatInterval: integer;
constructor Create(Hotkey: Integer; Command: String; CTRLMode: boolean; RepeatInterval: integer); overload;
constructor Create; overload;
procedure Execute;
end;
我需要获取它的大小(通过TFileStream保存)。此类的实例存储在其他地方的列表中,这是我的保存例程:
Stream:=TFileStream.Create(FileName,fmCreate or fmOpenWrite);
for i := 0 to Macros.Count-1 do
begin
Macro:=TMacro(Macros[i]);
Size:=sizeof(Macro);
Stream.Write(size,SizeOf(integer));
Stream.Write(Macro,sizeof(Macro));
end;
SizeOf(Macro)返回4bytes,这将是指针,但是我需要特定实例占用的实际空间。我想到的第一件事是获得ѭ2,因为它是一个动态结构,可返回其指针的大小。但这将意味着要有“ѭ3”之类的字眼,但这对于进一步扩展TMacro结构是不利的。
那么,有没有办法获取包含动态类型的结构的大小?
谢谢你的回答
没有找到相关结果
已邀请:
3 个回复
诞胃
然后将它们实现为一对一地读取/写入每个字段,或者将其与RTTI一起使用某种通用序列化器。这在Delphi 2010中更容易编写,因为它具有更广泛的RTTI功能集。
琶竞捆栓
缉康怪
就样式而言,我倾向于使用基于类的系统,该系统使用比基于记录的二进制存储更高级的持久性样式。但是,如果您要这样做,请使用RECORD,而不是Class,也不要使用String。 此外,请注意,在代码示例中,如果TMacro是一个类,则PMacro = ^ TMacro确实比错误更糟糕。 (除非您真的要进行某种双指针间接访问。) TMacro(引用类型)已经是按引用的,因此不需要获取它们的地址,因为它们是在TMacro类型的变量(如果是类)之间作为指针在内部传递的。因此,您确实确实需要对代码中的记录类型和值类型有一些了解。