Delphi 的结构体支持

一个结构体,在 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 不需要在代码里调用。它自动被执行。

结论

结构体的这种新的语法,还是值得学习的。记在这里,用得上的时候可以来这里查这个语法如何写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值