Delphi中的內存對齊 與 Packed關鍵字

 

以delphi爲例:
TTest = record
c1: char;
i1: Integer;
c2: char;
c3: Char;
end;
這個結構如果用sizeof取其佔用的內存大小,是多少呢,是1+4+1+1=7麼,不是,是4*3 = 12; 這是因爲32位編譯的時候,默認結構會自動內存對齊(32bit = 4byte)。

如果要想讓這個結構佔用7個字節的話,必須加上packed關鍵字。如下:
TTest = packed record
c1: char;
i1: Integer;
c2: char;
c3: Char;
end;

 

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章