在windows中内存的分配一次是4个字节的。而packed按字节进行内存的申请和分配,这样速度要慢一些,因为需要额外的时间来进行指针的定位。因此如果不用packed的话,delphi将按一次4个字节的方式申请内存,因此如果一个变量没有4个字节宽的话也要占4个字节!这样就浪费了,你可以用packed关键字取消这种优化。

例子:  
type  
         myrec   =   packed   record  
         n1   :   integer;         4个字节  
         n2   :   shortint;       1个字节  
end;  
sizeof(myrec)------     5  
  
type  
         myrec   =   record  
         n1   :   integer;  
         n2   :   shortint;  
end;  
sizeof(myrec)------     8

Record的数据各个字节都是对齐的,数据格式比较完整,所以这种格式相对packed占用的内存比较大,
但是因为格式比较整齐,所以电脑读取这个类型的数据的时候速度比较快。

而Packed Record对数据进行了压缩,节省了内存空间,当然他的速度也变的慢了。

type  
      //    Declare    an    unpacked    record  
      TDefaultRecord    =    Record  
          name1        :    string[4];  
          floater    :    single;  
          name2        :    char;  
          int            :    Integer;  
      end;  
      //    Declare    a    packed    record  
      TPackedRecord    =    Packed    Record  
          name1        :    string[4];  
          floater    :    single;  
          name2        :    char;  
          int            :    Integer;  
      end;  
var  
      defaultRec    :    TDefaultRecord;  
      packedRec      :    TPackedRecord;  
begin  
      ShowMessage('Default    record    size    =    '+IntToStr(SizeOf(defaultRec)));  
      ShowMessage('Packed    record    size    =    '+IntToStr(SizeOf(packedRec)));  
end;  
  
    Default    record    size    =    20  
    Packed    record    size    =    14

不过,对于现在的操作系统来,packed Record 节省的那些空间已不用考虑他了。除了做DLL(不用packed容易造成内存混乱)和做硬件
编程时(比如串口)编程时必须用到packed Record,其它情况都可以用Record

呵呵。 PIPI给我上了一课。 多谢。我犯了形而上学想当然的错误
专门试了一下
procedure TForm1.Button1Click(Sender: TObject);
var a: packed array[1..10] of Integer;
    b: array[1..10] of Integer;
begin
a[1] := 1;
a[2] := 256;
a[3] := 65535;
a[4] := 65535;
a[5] := 100000;
Edit1.Text := IntToStr(Sizeof(a));

b[1] := 1;
b[2] := 256;
b[3] := 65535;
b[4] := 65535;
b[5] := 100000;
Edit2.Text := IntToStr(Sizeof(b));
end;
两者是同样的内存尺寸

有 Packed 的占用内存小,但是速度慢一点
没 Packed 的占用内存大,但是速度快一点
比如说,有一个结构t,你又使用了一个a很大的array of t,那么可能要节省一点内存
但是,如果你不是申请很多t的实例,那么不用节省几个byte,要知道现在内存很大了
1M那可是 100多万 byte啊
另外,说一下为什么align了就快:
比如一个integer 4个字节,如果他的气死地址是4的倍数,0、4、8、12……
那么一次时钟(还是总线?)周期就可以读写它,
如果起始于1、2、3,那么要分2个周期才能读写它

用了packed后数据会压缩,但速度变慢。这就是两者的区别!

比如
packed record
aaa:byte
bbb:inetegr
ccc:byte
end //只占用6字节


record
aaa:byte
bbb:inetegr
ccc:byte
end //占用12个字节

delphi缺省使用 没有packed 的

Packed 还有一个要考虑的地方就是,如果你要做DLL的话,那么参数的传递就要用Packed的,否则很容易造成内存的写乱.

一般為了效率考量, structure, array.. 之類的資料, complier 會把記億體做所謂 alignment (對齊?) 的調整, 這樣存取時會比較快速

舉個例子, 沒有特別調整 complier 的 alignment 時:

type
   TTest = record
     x: integer; // 4 bytes
     y: char;    // 1 byte, 但實際上會是占 4 bytes
   end;

你可以做一個簡單的測試, sizeof(TTest) 會等於 8

但如果加上 packed 時, 則 complier 不做 alignment,
這時就會是你真正定義的長度了:

type
   TTest = packed record
     x: integer; // 4 bytes
     y: char;    // 1 byte, 實際上也會是占 1 byte
   end;

跑出來的結果, sizeof(TTest) 會等於 5

一般是不需 packed, 但如果需要這樣的應用 (如與dll接軌, 硬體控制),
就可能需要拿出來使用..

PS: packed 相當於 {$A1}

s07452你好:
宣告記錄型態(record),預設的編譯方式會將各欄佔用的記憶體長度以方便CPU存取的方式向word或double-word佔用空間大小對齊,以得到較佳的存取速度。如果宣告時使用packed record,則按照實際各欄佔用空間配置,但存取速度較差。你可以參考HELP裡關於packed的說明。

转载于:https://www.cnblogs.com/jieke/archive/2013/01/11/2855793.html

packed record与record区别相关推荐

  1. record java_Java Record类代码示例

    import org.zephyr.data.Record; //导入依赖的package包/类 /** * This method takes in a List of orderedPairing ...

  2. oracle创建record,oracle record | 学步园

    一.oracle record结构类型,定义方式如下: 1,自定义 type type_name is record(var1 datatype,var2 datatype2...); 例子: dec ...

  3. JDK14的新特性:Lombok的终结者record

    文章目录 简介 新的Record类型 探讨Record的秘密 record扩展 总结 JDK 14的新特性:Lombok的终结者record 简介 自从面向对象产生之后,程序界就开始了新的变化,先是C ...

  4. C# 9.0新特性详解系列之五:记录(record)和with表达式

    1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...

  5. JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)

    文章目录 1. 新语法结构 1.1 Java的REPL工具: jShell命令 1.2 异常处理之try-catch资源关闭 1.3 局部变量类型推断 1.4 instanceof的模式匹配 1.5 ...

  6. nutz 结合QueryResult,Record 自定义分页查询,不构建pojo 整合

    public QueryResult getHistoryIncome(int d, int curPage) throws Exception { /**sql**/ Sql sql = Sqls. ...

  7. SAP QM 不常用功能点之 Physical-Sample Record

    SAP QM 不常用功能点之 Physical-Sample Record A record that contains all master data and transaction data fo ...

  8. 快速搭建Java 17环境并玩转Record特性

    Java 17现在已经发布,不少同学蠢蠢欲试,但是又担心配置新的JDK会影响现在的项目环境.今天介绍一个项目级别的JDK配置方法.让你先人一步快速入门Java 17,同时也不会影响原有项目. 项目快速 ...

  9. ext store 数据修改_Ext 修改Store初始化加载完后修改record属性。

    /** * Created by huangbaidong on 2016/9/18. * 产品组件通用Store,*/Ext.define('app.component.ebs.itemdata.P ...

最新文章

  1. XamarinSQLite教程下载安装SQLite/SQL Server Compact Toolbox
  2. CRM订单上状态字段在UI的显示逻辑
  3. requests源码分析
  4. ebs 供应商地点信息_EBS标准的查看供应商地址
  5. (41)System Verilog输出变量时序延迟
  6. Introduction to Mathematical Thinking - Week 4
  7. leetcode978. Longest Turbulent Subarray
  8. boolean类型默认值_【Java基础】还在问String属于什么数据类型
  9. 杨辉三角数学性质及参考例题
  10. JAVA通过BufferedImage进行图片的绘制,缩放,裁剪,水印等操作
  11. Word控件Spire.Doc 转换教程(三):如何将 Word 转换为 PDF
  12. VirtualBox的vmdk文件压缩
  13. java activity_java中的Activity
  14. 【读过的书】《好看的皮囊千篇一律,有趣的灵魂万里挑一》
  15. 进口十大旋转编码器厂商
  16. C语言编程--根据麦克劳林公式计算任意角的正弦余弦
  17. LSV软件不定时无法下载谷歌影像的原因
  18. 云编译DSM引导(学习记录)
  19. 软件下载传送门(个人习惯自用记录)
  20. 计算机网络-常用英文简写与名词解释

热门文章

  1. 用shell脚本监控进程是否存在 不存在则启动的实例
  2. note-删除Visual Studio recent Projects list
  3. Linux 内核中的 GCC 特性(zz)
  4. Javascript编程基础1
  5. (转)关于Linux核心转储文件 core dump
  6. 【转】Linux查看物理CPU个数、核数、逻辑CPU个数
  7. 地理空间数据库(Geodatabase)结构(翻译)
  8. python django 动态网页_使用Django创建动态页面
  9. PowerShell-5.网络请求
  10. hdu2413 二分+二分匹配