Packed Record 和Record有何区别(10分)

  • 主题发起人 主题发起人 why_119
  • 开始时间 开始时间
W

why_119

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Scthead = Packed Record //请问这里的Packed Record 和Record有何区别.....
 Hflag,Htagx,Htype,Numstock,NextPic,Currpic:Integer;
end;
****************
 
举个帮助中的例子:
packed array[1..1000] of integer
正常情况下 array[1..1000] of integer 中的每个数据占用同样大小的内存
而packed array[1..1000] of integer 中是根据实际数据值需要内存的大小确定每个
数据占用的内存
PACKED ARRAY 节约了内存。 却因为数据内存中保存的不定长牺牲了查找定位速度。
 
我还是不明白。。。。:(
Tinfrec = Packed Record //如果这样写呢...
 infcode:array[0..9] of Char;
 infname:array[0..31] of Char;
 infzqjc:array[0..17] of Char;
unuse:String[12]
 
不知道王大虾和我说的是不是一个意思:
packed 指示内存分配不必进行对齐。你可以分配一个总共占用3个字节的数组。
如果不用这个关键字,数据向双字对齐。对齐以后的访问速度会加快。看起来3
个字节的数组实际应当会占用4个字节(双字),当然,对齐的粒度可以调节。
 
比如数字1 可以用 shortint 保存 只站1个字节8位
而如果这个数字是 100000000, 那么就只能用32位保存。 就是说数组中的值是不定长的
packed array 就是按数组中的实际值来决定内存分配大小

而 array of integer 对每个值都按4 字节32位保存。 浪费了内存。但是寻址快了
你上面的例子中的记录中每个数据都指定了长度,是定长的。用不用packed 都节约不了
内存。
 
老王,不是你说的那样,packed 表示不align,就是不对齐,所有元素都紧密排列
非packed的record,就是align了的,为了访问的速度,对元素的起点进行了对齐的处理
比如,
type t= record
a:char;
b:smallint;
end;
如果b开始于2的倍数的地址,存取速度会比较快
所以它从字节2开始存放,而a从0开始,字节1就没用上,是个空洞
整个record占用4个字节

type t=packed record
a:char;
b:smallint;
end;
不进行对齐,b直接跟在a后面,从字节1开始存放
整个record占用3个字节,但是存取速度会慢一点
 
看来我是学不会了....
 
呵呵。 PIPI我说的就是你说的意思阿。 我怕说对齐他不明白。HELP里写的很清除阿
 
HELP里写的很清除阿
我不认识E文啊....
 
不同啊
你说 packed array[1..1000] of integer
保存 1 会使用shortint,但不是啊,不管packed不packed,都是用integer保存的
packed不会缩小元素的尺寸的
 
我的例子
type t= record
a:char
//1个字节
//这里有1个字节的空洞没用使用,就是为了下面的b能从某个地址开始存放
b:smallint
//2字节
end;
a从地址0开始用了1个字节,接着从地址1开始浪费1个字节不用,从地址2开始放2个字节的b
但不会因为b是1的话,就缩短为shortint
 
呵呵。 PIPI给我上了一课。 多谢。我犯了形而上学想当然的错误
专门试了一下
procedure TForm1.Button1Click(Sender: TObject);
var a: packed array[1..10] of Integer;
b: array[1..10] of Integer;
begin
a[1] := 1;
a[2] := 256;
a[3] := 65535;
a[4] := 65535;
a[5] := 100000;
Edit1.Text := IntToStr(Sizeof(a));

b[1] := 1;
b[2] := 256;
b[3] := 65535;
b[4] := 65535;
b[5] := 100000;
Edit2.Text := IntToStr(Sizeof(b));
end;
两者是同样的内存尺寸
 
其实,packed record主要用在将ms的头文件转成pascal的声明中
因为,delphi默认的record由于默认编译条件下是align字节,
这导致sizeof(record)可能会变大,但h文件的结构声明是定长的
,如果不用packed record,传递参数调用api就会出错,所以引入了
packed关键字

另外我在写同单片机通讯协议时,由于数据信息是定长的一个结构,所以
我的结构都声明为packed record
 
趨快做筆記。
 
谢谢二位...是不是我在写的时...最好是用Packed Record 它..
因为它是连续死用内存的...
而Record它己某种方法...把数据在 内存中align...中间可能会有空洞?
不知道我理解的对吗?....
 
有 Packed 的占用内存小,但是速度慢一点
没 Packed 的占用内存大,但是速度快一点
比如说,有一个结构t,你又使用了一个a很大的array of t,那么可能要节省一点内存
但是,如果你不是申请很多t的实例,那么不用节省几个byte,要知道现在内存很大了
1M那可是 100多万 byte啊
另外,说一下为什么align了就快:
比如一个integer 4个字节,如果他的气死地址是4的倍数,0、4、8、12……
那么一次时钟(还是总线?)周期就可以读写它,
如果起始于1、2、3,那么要分2个周期才能读写它
 
后退
顶部