糖炒栗子

cheap to talk,show muscle would be better...

导航

delphi:packed and record

问题:

tagTVITEMA     =     packed     record   
            mask:     UINT;   
            hItem:     HTreeItem;   
            state:     UINT;   
            stateMask:     UINT;   
            pszText:     PAnsiChar;   
            cchTextMax:     Integer;   
            iImage:     Integer;   
            iSelectedImage:     Integer;   
            cChildren:     Integer;   
            lParam:     LPARAM;   
        end;   
    
    是不是与C中的struct相似??

答案:

Packed关键字是与编译有关的!!!   
    
    在默认情况下,Delphi编译器是对数据进行优化的!!!   
    
    例如:   
    TX     =     Record   
          A     :     Char;   
          B     :     Integer;   
    End;   
    
    在这个记录中,TX的大小应该是5个字节,但是由于Delphi的优化,Tx的大小变成了8个字节,所以为了得到TX的真实大小,这个时候就要使用Packed关键字了,禁止进行优化!!!一般Packed关键字在使用C++/C的API汉书中用得比较多,一般Delphi内部自己的程序不需要使用Packed关键字,除非你想得到某个对象的真实大小!!!   
    为什么优化:   
    举一个现实生活中的例子,假设有两个杯子,一个装满了水,另一个只装了1/3的水,那么实际物理上这些水占用了两个杯子,因为我们不能说占了4/3的杯子,因为我们没办法得到2/3的杯子。在这一杯子就是CPU中的寄存器,TX对象中的A,虽然只有一个字节,但它却占用了一个寄存器的空间(4个字节,这就是32位计算机,如果是64位计算机,一个寄存器的大小将变成8个字节),所以经过优化的结果是TX的大小是8。优化的数据可以提高执行效率,因为我们不必关心杯子里到底有多少水,1/4?1/3?1/2...,我们只要关心那些水占据了一个杯子,这样会节省大量的分析杯子里有多少水的时间!!!这就是Packed的作用!!!

加Packed就是为了   
    1、使用sizeOf得到记录的真实大小。   
    2、节省内存空间。   
    3、保证与其他程序通讯的正确性。   
    ....   
    
    比如你编写一个通讯程序,定义的记录大小为10用来存储现金,如果这时你让Delphi优化了这个记录,天知道金额会变成什么!!!

packed     record   
    是压缩记录类型


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个字节!这样就浪费了。

posted on   糖炒栗子  阅读(1627)  评论(1编辑  收藏  举报

努力加载评论中...
点击右上角即可分享
微信分享提示