一个结构体,在 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 operator TSession.Initialize(out Dest: TSessionHeader);
begin
Dest.SrcNumb := 12;
Dest.DestNumb := 21;
end;
//上述代码是结构体的定义代码。上述代码中的 Initialize 方法自动初始化结构体里面的字段,
//在定义一个结构体变量的时候,不需要调用这个方法。
//定义一个结构体变量,Delphi 在内部自动调用这个初始化方法。
注意:上述 Initialize 不需要在代码里调用。它自动被执行。
结论
结构体的这种新的语法,还是值得学习的。记在这里,用得上的时候可以来这里查这个语法如何写。