packed record与record区别
在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区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享懒人张RDLC报表(四)
- 下一篇: Android---如何返回上一Acti