一个结构体,在 Delphi 里面,定义为一个 Record。
当然,一个 Record 也可以有另外一种,叫做:packed record。
这两种 Record 的区别是其内存分布。Record 里面会对每个字段做操作系统的【对齐】,比如 32 位操作系统,一个整数是 4 个字节,它一次处理 4 个字节会效率比较高,因此 Delphi 在内部会让一个 3 字节的字段,占用 4 个字节的内存。而 Packed Record 则是每个字段该多少就占多少内存。例子如下
TMyParam1 = Record
A1: Word;
A2: Byte;
End;
TMyParam2 = packed Record
A1: Word;
A2: Byte;
End;
SizeOf(TMyParam1) 和 SizeOf(TMyParam2) 的大小不同。
结构体的初始化
定义结构体的时候,在以前的 Delphi 版本里面,没法初始化。如果要初始化,是每个需要结构体变量的地方,自己用代码去做。这样可能需要在很多使用这个结构体的地方写相同的初始化代码。
现在的 Delphi 语法支持初始化代码了,例子:
TSession = packed record
SrcNumb: Cardinal;
DestNumb: Cardinal;
//以下两个方法是 10.4 才有的
class operator Initialize (out Dest: TSessionHeader); //初始化方法,不需要有地方调用。分配内存时自动执行。
class operator Finalize(var Dest: TSessionHeader);
end;
class operator TSession.Finalize(var Dest: TSessionHeader);
begin
end;
class o

本文介绍了Delphi中Record和PackedRecord的区别,主要在于内存布局,PackedRecord不进行字段对齐。同时,展示了Delphi新版本中结构体支持初始化的方法,包括classoperatorInitialize和classoperatorFinalize,简化了结构体使用过程。
最低0.47元/天 解锁文章
1569

被折叠的 条评论
为什么被折叠?



