求教 record 和 packed record 的区别?(50分)

  • 主题发起人 主题发起人 HammerLi
  • 开始时间 开始时间
H

HammerLi

Unregistered / Unconfirmed
GUEST, unregistred user!
二者在使用上和理论上有何区别?
 
在{$A+}(默认值)的情形下, 如果没有使用 packed 修饰词宣告的 record
型态, 其字段会以CPU可以有效存取的方式向 1. 2. 4 等边界对齐,
以获取最佳的存取速度。以下列的程序示例来说:
{$A+}
type
MyRecord = record
ByteField: byte;
IntegerField: integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(MyRecord)));
end;
ShowMessage在{$A+}时显示的结果是:「8」
倘若是{$A-}, 那所得的结果是「5」,
按理说, Byte应该只要一个byte就足够了, 但是考虑到硬件的执行特性,
经过对齐后的record会有比较好的执行速度。
有关这个Compiler Directive要注意的事项是: 不管{$A}的开关是ON或OFF,
使用packed修饰过的记录宣告, 是一定不会对齐的. 例如:
MyRecord = packed record // 不会对齐的记录宣告方式
 
楼上已经非常good
 
學習了...
 
下面的帖子已经讲的超级详细了(:

“Packed Record 和Record有何区别”

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1015017
 
使用内存空间不一样...
 
看此处末端 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2385922
 
To 网事如风:链接我看过了。我的理解:我认为 Packed 标志要用在具有不同类型元素的 Record 中才会体现出查找时钟周期、内存使用大小的不同。
如:
RecordA = record
B: Byte;
I: Integer;
end;

此时 RecordA 在内存中的分配是:

[ ][ ][ ]

总共占用了 8 个字节,这才会有 SizeOf(RecordA)= 8 的结果。

如果加上了 Packed 标识符变成:

RecordA = record
B: Byte;
I: Integer;
end;

此时 RecordA 在内存中的分配是:



总共占用了 5 个字节,这才会有 SizeOf(RecordA)= 5 的结果。

如果像王寒松的举例中使用

a: array[1..10] of integer;

因为只有一种数据类型,不论用不用 Packed 标识,其每个元素的大小是一样的,所以怎么测 SizeOf()都会得到同样的结果。其在内存中的分配也是一样的,不知道我的理论对不对。
 
知道理论了以后,应该在什么地方用 Packed 呢?是不是有关 Win32API 的地方都要用到?
 
后退
顶部