pack record /record 区别

delphi中Record 和Packed Record的区别   .

分类: delphi  2011-06-25 09:33 3669人阅读 评论(2) 收藏 举报 

delphiinteger编译器windows

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

     比如:        

     TA   =   record             

         a:   Char;             

         b:   Integer;         

     end;     

     和        

     TB   =   packed   record             

        a:   Char;             

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

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

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

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

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

 type t=  packed record     和    type t=   record        

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

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

pack record /record 区别的相关文章

#pragma pack(push,1)与#pragma pack(1)的区别(转)

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐.#pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态 因

#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐. #pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态

学习:record用法

详情请参考官网:http://www.erlang.org/doc/reference_manual/records.html http://www.erlang.org/doc/programming_examples/records.html 1. record本质上是tuple. 2.获取record的结构相关的信息的函数: To each module using records, a pseudo function is added during compilation to obta

Snapchat- Group Record using Union-find

最近一直在做面筋,就没有在这边更新!但是最近!没有偷懒! // 题目是手机上的通讯录,每条记录只有(name, number)这种pair,有些记录名字重复,有些记录号码重复,让我返回一个list<list<Record>>,// 将所有记录按人分组.比较tricky的点在于(ABC,123), (ABC, 456), (BCD, 456)// 三条记录,第一条和第三条也属于同一个人.要求时间复杂度尽量小 uf算法我是明白的,但是我想的时候的困惑在于 1.ufMap里面存放什么,是

利用hadoop命令rcc生成Record 一种简单的方式实现自定义的writable对象

hadoop 的bin目录下面一个rcc命令,网上介绍很少.看了一下源码.发现可以用来生成 java和c++的hadoop Record 类代码,比起自己直接实现writable 接口,简单很多而且不容易出错,不妨试一下.具体方法如下: >rcc Usage: rcc --language [java|c++] ddl-files 1 新建 ddl文件 >vim stud.ddl module com.xschao.bean { class Stud{ ustring name; long i

Ext 修改Store初始化加载完后修改record属性。

/** * Created by huangbaidong on 2016/9/18. * 产品组件通用Store, */ Ext.define('app.component.ebs.itemdata.ProductStore', { extend: 'Ext.data.Store', autoLoad : true, constructor : function(config) { Ext.apply(config, { /*data:(function(){ var array = [];

Siebel NextRecord And DeleteRecord In Loops Skips Record

DeleteRecord implicitly moves the record pointer to the next record in the record set.  If a call to NextRecord is made after a call to DeleteRecord the record pointer will move twice.  This means that a record will be skipped.  When deleting records

jfinal对象转Record原理【疑问】

/*DbPro.class*/ public transient Record findFirst(String sql, Object paras[]{ List result = find(sql, paras); return result.size() <= 0 ? null : (Record)result.get(0); } public transient List find(String sql, Object paras[]) { Connection conn = null;

PL/SQL基本结构---PLSQL复合类型---记录类型record

记录类型record  record类型最常用,声明的时候可以加not null,但必须给初始值,如果record类型一致可以相互赋值,如果类型不同,里面的字段恰好相同,不能互相赋值.引用记录型变量的方法是“记录变量名.基本类型变量名”.    ―――――――――――――――――――――――――――――――――――――    declare         type t_first is record(              id number(3),              name v