以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