Delphi记录类型变量的内存分配

时间:2010-01-27 09:04:30  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:r;var2,var3,var4,var5,var6,var7,var8:shortint;var9:integer;var10:shortint;var11:integer;var12,var13:shortint;end;...ShowMessage(intTostr(SizeOf(MyRec)));结果显示为18,而按我想象应为16。请高手讲解一下Delphi5.0中变量内存空间分配机制,因为我有一个数组MyArray:Array...
  正文:

请看下面的代码,结果应该是什么?


type
MyRec=Record
var1:integer;
var2,var3,var4,var5,var6,var7,var8:shortint;
var9:integer;
var10:shortint;
var11:integer;
var12,var13:shortint;
end;
...
ShowMessage(intTostr(SizeOf(MyRec)));


结果显示为18,而按我想象应为16。请高手讲解一下Delphi5.0中变量内存空间分配机制,因为我有一个数组MyArray:Array[1..1000000] of MyRec;需要考虑节省内存问题,
另外不要说我懒不爱看书,我手头所有关于Delphi的书都没有提到这个问题。

回答:
显示的结果应该为28,而不是18!按道理应该是22。用Packed的结果就是22。
拟定义的数组比较大,应该用packed record!

原因如下:
在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了。按上面的例子来说:
  var1:integer;//integer刚好4个字节!
  var2-var5占用4个字节,Var6-Var8占用4个字节,浪费了一个字节。
  var9:integer//占用4个字节;
  var10:占用4个字节;浪费3个字节
  var11:占用4个字节;
  var12,var13占用4个字节;浪费2个字节
所以,如果不用packed的话,那么一共浪费6个字节!所以原来22个字节的记录需要28个字节的内存空间!

这是因为在32位的环境中,所有变量分配的内存都进行“边界对齐”造成的。这样做可以对速度有优化作用;但是单个定义的变量至少会占用32位,即4个字节。所以会有长度误差,你可以用packed关键字取消这种优化。
深入的分析,内存空间(不是内存地址)在计算机中划分为无数与总线宽度一致的单位,单位之间相接的地方称为“边界”;总线在对内存进行访问时,每次访问周期只能读写一个单位(32bit),如果一个变量横跨“边界”的话,则读或写这个变量就得用两个访问周期,而“边界对齐”时,只需一个访问周期,速度当然会有所优化。  


"Delphi记录类型变量的内存分配"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-27/12465.html


关键字:

关于《Delphi记录类型变量的内存分配》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td