Record 和Packed Record 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对结构体中的字段访问会比第一种方式慢!但是更节约空间。有Packed 的占用内存小,但是速度慢一点。没Packed 的占用内存大,但是速度快一点

比如:

TA   =   record

a:   AnsiChar;

b:   Integer;

end;

TB   =   packed   record

a:   AnsiChar;

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:AnsiChar;  {1}               a:AnsiChar;{8}   --因为a的长度不够一个字(8个字节),而紧接则的d为一个字(8个字节)所以要补齐8 

d : double ;{8}                 d : double ;{8}

b:smallint;{2}                   b:smallint; {8}

end;    :Sizeof(t) =11         end;    :  Sizeof(t) =24 的区别:看后面的注释{**} ;

例子2------------------------------------

type t=  packed record     和    type t=   record

a:AnsiChar;  {1}                    a:AnsiChar;   //因为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) =11             end;    : Sizeof(t) =16 的区别:看后面的注释{**} ;

在Windows中内存的分配一次是4个字节的。而Packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用Packed的话,Delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了。

c/c++ struct内存对齐:
  成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.如果有#pragma pack(8),它虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.也就是说对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。实际上根据这些规则安排整个的内存布局的算法很简单,假设起始地址为0,开始安放第1个成员,然后找到下一个成员可以安放的起始位置,首先这个位置肯定在第一个成员之外,其次满足那些对齐因素。找到满足这两个条件的第一个位置即可。然后再考虑下一个成员,逐次进行下去。最后再考虑整个结构体的对齐因素,确定整个结构体的结束位置,这个位置的下个位置也就是下一个结构体的开始位置,保证它能够满足对齐。

比如:
struct MyStruct 

char dda; 
double dda1;   
int type 
};

(简单说明) 
struct MyStruct 

char dda;//偏移量为0,满足对齐方式,dda占用1个字节; 
double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8 
             //的倍数,需要补足7个字节才能使偏移量变为8(满足对齐 
             //方式),因此VC自动填充7个字节,dda1存放在偏移量为8 
             //的地址上,它占用8个字节。 
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍 
           //数,满足int的对齐方式,所以不需要VC自动填充,type存 
           //放在偏移量为16的地址上,它占用4个字节。 
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构 
   //的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof 
   //(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为 
   //sizeof(double)=8的倍数。 
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。

C++中的 struct                          相当于 delphi 的 record ,

C++中的有#pragma pack 的struct  相当于 delphi 的 packed record 

转载于:https://www.cnblogs.com/h2zZhou/p/6564964.html

delphi中Record 和Packed Record的区别相关推荐

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

    仔细观察,你会发现: compile 会比 build 少了一些信息,其原因在于: Build编译全部与工程相关联的文件,可包括版本信息及工程中的预编译变量等:Compile只重新编译更改过的相关单元 ...

  2. packed record与record区别

    在windows中内存的分配一次是4个字节的.而packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位.因此如果不用packed的话,delphi将按一次4个字节 ...

  3. record, packed record和变体记录

    //Integer类型刚好是4个字节,ShortInt类型是1个字节,但是Windows中内存是4字节分配, //所以这里其实还是4个字节,用SizeOf可以看到这个record的大小是8字节,这样虽 ...

  4. delphi中pos函数怎么用?

    pos(a,b)函数用法如下:取出子串a,在父串b中第一次出现的位置. 例如: pos('b','abcd'): 返回结果是2: 在delphi中使用汇编异常的简单,只用使用关键字asm ....en ...

  5. Delphi中record的使用

    在Delphi中的Record类型中,与之C语言对应的即是结构体类型(struct),也可能是为了符合C语言或C++程序员的习惯,对于它在Delphi中的应用存在的一些问题进行初步的说明.在Delph ...

  6. delphi中exit,abort,break,continue,halt,runerro 的区别

    delphi中表示跳出的有break,continue, exit,abort, halt, runerror. 1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或re ...

  7. Delphi中exit、break、continue等跳出操作的区别

    Delphi中表示跳出的有break,continue,abort,exit,halt,runerror等 1.break 强制退出最近的一层循环(注意:只能放在循环里:而且是只能跳出最近的一层循环) ...

  8. Delphi中destroy, free, freeAndNil, release用法和区别

    经过这段时间对delphi中free 和 release 的仔细学习,先总结如下: 1.form.free直接释放资源后,调用OnDestroy事件,但是没有将form指针改为nil 2.form.r ...

  9. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

最新文章

  1. 从0梳理1场CV大赛(Top 3%)!
  2. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
  3. javascript 通过键获取值
  4. 【2022新书】机器学习基础
  5. boa服务器如何运行cgi,嵌入式WEB服务器BOA+CGI.ppt
  6. ret2dlresolve归纳
  7. PHP学习方向-进阶2(三) 1
  8. MSpider爬虫搜索
  9. OSI网络结构的七层模型与TCP/IP层次模型
  10. viewpager 获取当前现实的view
  11. java找链表中最小值_算法图解:如何找出栈中的最小值?
  12. linux 命令 tar 打包压缩命令 date时间 命令实践
  13. 无法打开网上邻居计算机,win7网上邻居在哪 无法访问怎么办【图文】
  14. latex插图\begin{minipage}强制左移\hspace命令
  15. 【Excel】数据的排序、筛选和分类汇总
  16. not authorized on test to execute command { $eval: \return 1111\
  17. springboot注解方式实现aop及常规方式
  18. ncre计算机职业英语,NCRE计算机职业英语一级考试样卷
  19. C#——Windows银行储蓄管理系统
  20. 如何制作GIF表情包,动态GIF怎么做

热门文章

  1. [六字真言]1.唵.遁入佛门之异常.md
  2. SQL Server窗口函数:ROWS与RANGE
  3. 基于DCT系数的实时监控中运动目标检测
  4. Chrome截图扩展程序-“截图快手”
  5. solr 高并发_Solr搜索引擎 — SolrCloud介绍和环境准备
  6. JVM初学之JVM的运行时数据区
  7. java语法糖效率高吗_打包 Java将持续向“高糖”方向发展,你真的了解Java语法糖吗? _好机友...
  8. python实现排队论模型_Logistic模型拟合COVID-19疫情以及Python实现
  9. 步骤一:入门linux基础/01Linux简介和安装/002Linux发行版的介绍
  10. php升级语言,PHP是最好的语言,PHP 8.0带来了重大更新