转载:http://blog.csdn.net/rznice/article/details/6566978

  第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐。

  而第二种带packed关键字的结构体表明编译器编译结构体的时候不需要进行字对齐,这种方式对结构中的字段访问回避第一种方式慢!但是更节约空间。

  所以归纳来说,有packed的占用内存小,但是速度慢一点。没有packed的占用内存大,但是速度快一点

  比如

TA = record
a : char;
b : integer;
end;

  和

TB = packed record
a : char;
b : integer;
end;

  中,TA.b位于TA结构开始出的第五个字节,TB.b位于TB结构开始处的第二个字节,即TA结构中在TA.a和TA.b之间插入了3个无用字节,因为TA.b在内存中的地址是按字对齐的---即这个地址能被4整除,而TB中则没有这些无用字节,但是TB.b不是字对齐的,对他的访问比对TA.b慢。

  例子1

type
t = packed record
a : char; //1个字节
d : double; //8个字节
b : smallint; //4个字节,虽然本来smallint是2个字节,但是因为如果一个变量没有4个字节宽的话也要占4个字节,所以现在要补宽到4个字节
end; //所以sizeof(t) = 13

  和

type
t = record
a : char; //8字节,因为a的长度不够8个字节,而紧邻着的d 为一个字(8个字节),所以要补齐8
d : double; //8字节
b : smallint; //8字节
end; //sizeof(t)=24

  例子2

type
t = record
a : char; //1个字节
b : smallint; //2个字节
d : double; //8个字节
end; //sizeof(t)=13

  和

type
t = record
a : char; //因为a的长度为1个字节,后面的b为两个字节,累加起来是3个字节
//再后面的d为8个字节,所以a+b要补齐到8个字节
b : smallint; //a+b共占8个自己
d : double; //8个字节
end; //sizeof(t) = 16;

  在windows中内存的分配一次是4个字节。而packed按字节进行内存的申请和分配,这样速度要慢一点,因为需要额外的事件来进行指针的定位。

  因此如果不用packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节

Delphi中record和packed record的区别的更多相关文章

  1. delphi中Record 和Packed Record的区别

    Record 和Packed Record 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对 ...

  2. delphi中exit,abort,break,continue 的区别

    from:http://www.cnblogs.com/taofengli288/archive/2011/09/05/2167553.html delphi中表示跳出的有break,continue ...

  3. DELPHI中build和compile有什么区别?

    Build编译全部与工程相关联的文件,可包括版本信息及工程中的预编译变量等:Compile只重新编译更改过的相关单元及文件,调试是Compile就可以了,若是发布,则Build为好 BUILD  =C ...

  4. Delphi中close与Terminate方法的区别

    在有多个Form窗体时可以体现出来.用close是只关闭本窗体,而用Application.terminate是关闭整个程序,包括所有窗体.(1)当Close是一个主窗体时,程序会退出.Close会发 ...

  5. delphi中nil、null、UnAssigned区别

    nil:空指针,空地址,对象也是指针,所以可以object := nil;null:null是一个未定义值的变量,既不是0也不代表空字符串,它是未定义的.http://www.delphibasics ...

  6. delphi中pos和Ansipos函数的区别

    POS和ANSIPOS的主要区别在于,POS参数多用于是一个字符,而ANSIPOS多用于是多个字符: 例如:i:=pos('a','sssssas'); i:=ansipos('abc','sdabc ...

  7. Delphi中的内存对齐 与 Packed关键字

    以delphi为例:TTest = recordc1: char;i1: Integer;c2: char;c3: Char;end;这个结构如果用sizeof取其占用的内存大小,是多少呢,是1+4+ ...

  8. delphi中formatFloat代码初探(在qt下实现floatformat的函数)

    由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...

  9. Delphi中BitBlt函数实现屏幕对象抓图

    uses WinTypes, WinProcs, Forms, Controls, Classes, Graphics; function CaptureScreenRect( ARect: TRec ...

随机推荐

  1. ZJOI2014 2048

    Description 提交答案题,写个2048 AI 告诉你随机数生成方式. Sol xjblg+A*. 首先我写了个模拟,2048. 然后自己YY就可以啦...各种乱搞... 因为随机数,一个最好 ...

  2. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  3. METEOR 及ANGULARJS

    最近学习:METEOR 及ANGULARJS,收藏相关资源: 1.METEOR 中文书:http://zh.discovermeteor.com/ 2.METEOR 及ANGULARJS 联合开发:h ...

  4. jQuery获取循环中的选中单选按钮radio的值

    1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...

  5. Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)

    Tomcat启动时报如下错误:     java.lang.OutOfMemoryError: PermGen space 解决办法:     配置相关内存大小.其中按照启动tomcat的不同方式,分 ...

  6. Mac下安装MySQL

    2015-07-13 15:10:32 Mac下用homebrew安装软件还是很方便的 brew install mysql 等待一会儿安装完毕后到安装目录: /usr/local/Cellar/my ...

  7. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

  8. C# 总复习

    1.循环语句 四要素:初始条件.循环条件.循环体.状态改变 循环的最后一句:循环条件不再满足 2. ++     --int a = 5; //在赋值语句中,后++需要,先进性赋值,然后进行+1运算 ...

  9. iOS - iPhone开发 UILocalNotification的使用

    OS下的Notification的使用 Notification 是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iO ...

  10. JS图表插件(柱形图、饼状图、折线图)

    http://www.open-open.com/lib/view/open1406378625726.html