Record 和Packed Record的区别
2010-11-17 20:34
225 查看
Record 和Packed Record
第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,
而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对结构体中的字段访问会比第一种方式慢!但是更节约空间
有 Packed 的占用内存小,但是速度慢一点
没 Packed 的占用内存大,但是速度快一点
比如:
TA = record
a: Char;
b: Integer;
end;
和
TB = packed record
a: Char;
b: Integer;
end;
中:
TA.b位于TA结构开始处第4个字节, TB.b位于TB结构开始处第二个字节. 即TA结构中在TA.a和TA.b中间插了3个无用字节, 为了TB.b在内存中的地址是按字对齐的--即这个地址能被4整除, 而TB中则没有这些无用字节, 但是TB.b不是字对齐的, 对它的访问比对TA.b慢.
例子1-----------------------------------------------------
type t= packed record 和 type t= record
a:char; {1} a:char;{8} --因为a的长度不够一个字(8个字节),
而紧接则的d为一个字(8个字节)所以要补齐8
d : double ;{8} d : double ;{8}
b:smallint;{2} b:smallint; {8}
end; :Sizeof(t) =13 end; : Sizeof(t) =24
的区别:看后面的注释{**} ;
例子2------------------------------------
type t= packed record 和 type t= record
a:char; {1} a:char; //因为a的长度为1个字节,后面的b为两个字节累加3个字节,
//再后面d为8 个字节,所以a+b要补齐到8个字节
b:smallint;{2} b:smallint; a+b占8个字节(即一个字)
d : double ;{8} d : double ;{8}
end; :Sizeof(t) =13 end; : Sizeof(t) =16
的区别:看后面的注释{**} ;
在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了.
第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,
而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对结构体中的字段访问会比第一种方式慢!但是更节约空间
有 Packed 的占用内存小,但是速度慢一点
没 Packed 的占用内存大,但是速度快一点
比如:
TA = record
a: Char;
b: Integer;
end;
和
TB = packed record
a: Char;
b: Integer;
end;
中:
TA.b位于TA结构开始处第4个字节, TB.b位于TB结构开始处第二个字节. 即TA结构中在TA.a和TA.b中间插了3个无用字节, 为了TB.b在内存中的地址是按字对齐的--即这个地址能被4整除, 而TB中则没有这些无用字节, 但是TB.b不是字对齐的, 对它的访问比对TA.b慢.
例子1-----------------------------------------------------
type t= packed record 和 type t= record
a:char; {1} a:char;{8} --因为a的长度不够一个字(8个字节),
而紧接则的d为一个字(8个字节)所以要补齐8
d : double ;{8} d : double ;{8}
b:smallint;{2} b:smallint; {8}
end; :Sizeof(t) =13 end; : Sizeof(t) =24
的区别:看后面的注释{**} ;
例子2------------------------------------
type t= packed record 和 type t= record
a:char; {1} a:char; //因为a的长度为1个字节,后面的b为两个字节累加3个字节,
//再后面d为8 个字节,所以a+b要补齐到8个字节
b:smallint;{2} b:smallint; a+b占8个字节(即一个字)
d : double ;{8} d : double ;{8}
end; :Sizeof(t) =13 end; : Sizeof(t) =16
的区别:看后面的注释{**} ;
在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了.
相关文章推荐
- delphi中Record 和Packed Record的区别
- packed record与record区别
- [Delphi]Packed Record和Record的区别
- [Delphi]Packed Record和Record的区别
- delphi中Record 和Packed Record的区别
- *Delphi中record和packed record的区别
- delphi中Record 和Packed Record的区别
- packed record & record 区别 [转]
- delphi中Record 和Packed Record的区别
- delphi中Record 和Packed Record的区别
- packed record与record区别
- delphi中Record和Packed Record区别
- packed record和record的区别
- delphi中Record 和Packed Record的区别
- [Delphi]Packed Record和Record的区别
- Ext.js5表单—有真实的load,submit行为的表单(reader在json.xml中record的区别)(49)
- MediaRecorder和AudioRecord的区别和联系
- MediaRecorder和AudioRecord的区别和联系
- ext.data.record.create中 name与mapping的区别
- Record Level PeopleCode 和 Component Level PeopleCode 的区别