delphi 中 Record ,packet Record在windows中内存的分配一次是4个字节的。而packed按数据类型进行内存的申请和分配,读取时也是按照数据型的大小进行指针定位,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用packed的话,delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了,你可以用packed关键字取消这种优化。
例子:
type
myrec = packed record
n1 : integer; 4个字节
n2 : shortint; 1个字节
end;
sizeof(myrec)------ 5
type
myrec = record
n1 : integer;
n2 : shortint;
end;
sizeof(myrec)------ 8
一个结构体,在 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 在内部自动调用这个初始化方法。
复制代码
|