Packed Record 與 Record 的差別 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
先說明 Packed Record 與 Record 的差別
Packed 的描述: 請 Delphi 在規劃記憶體的空間時,以【該型態的 Size 來規劃記憶體空間】即可,目前 C 語言是使用這種 Record 型態,所以當2個語言間資料互通時,要用這個哦!! OK~~ 有了上面的描述後,再來就是 Record 了 宣告一個【記錄】的型態,可在裡面宣告不同的資料型態,供使用者儲存 Record 是用一種 Align 的方式來儲存變數區,以每 4 Bytes 的方式來區隔,加快讀取的速度 例: [code delphi] type TTestRecord = Record AInteger: Integer; AString: String; AChar: Char; ....... end; // 使用方法 Var TestRecord: TTestRecord; begin TestRecord.AInteger := 1; TestRecord.AString := 'Ya'; TestRecord.AChar := #65; end; [/code] OK~~, 再來就是進入主題了,看一下下面的例子 (資料來源:Delphi Basic ) [code delphi] type // 定義一個無 Packed 的 Record TDefaultRecord = Record name1 : string[4]; floater : single; name2 : char; int : Integer; end; // 定義一個有 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; [/code] 此時第一個 Showmessage 秀出來的是 20 第二個 ShowMessage 秀出來的是 14 我們來看看 Delphi 是怎麼規劃記憶體的 [code delphi] TDefaultRecord = Record name1 : string[4]; // 長度 4 1 Bytes (還有一個 String[0] 哦,別忘了) floater : single; // 長度 4 Bytes name2 : char; // 長度 1 Byte int : Integer; // 長度 4 Bytes end; [/code] 以上總計 5 4 1 4 = 14 ==>>>> 那... 怎麼我們是算到了 Packed 的長度呢? 其實依我們原本對型態長度認識,這樣的計算是沒有錯的,但 Delphi 為了加速在讀取 Record 中的值 每一個不足4 Byte 的以 4Byte 計!!! 所以我們再來算一次 [code delphi] TDefaultRecord = Record name1 : string[4]; // 長度 4 1 Bytes (還有一個 String[0] 哦,別忘了) 此時這裡變 8 Bytes floater : single; // 長度 4 Bytes 這裡維持 4 Bytes 不動 name2 : char; // 長度 1 Byte 這裡變成了 4 Bytes int : Integer; // 長度 4 Bytes 這裡維持 4 Bytes 不動 end; [/code] 所以 8 4 4 4 = 20 這樣對 packed record 與 record 比較有印象了嗎?? 或是另一種比喻,有學過 SQL Server 的人,應該知道 VarChar 與 Char 的差別 Char 是固定了長度,而 VarChar 是可變長度,所以 SQL 在讀資料時,讀取 Char 比讀取 VarChar 還快! 有 Packed 的占用記憶體小,但是速度慢一點 沒 Packed 的占用記憶體大,但是速度快一點 另一個 Sample ,對於 Char 的部份,再看的更清楚一點!! [code delphi] TSamele1 = packed record c1: Char; // 1 Byte i: integer; // 4 Bytes c2: Char; // 1 Byte end; sizeof(TSamele1) = 6; TSamele2 = record c1: Char; // 從 1 Byte 變 4 Bytes i: integer; // 4Bytes c2: Char; // 從 1 Byte 變 4 Bytes end; sizeof(TSamele2) = 12; TSamele3 = record c1: Char; // 1 Byte c2: Char; // 1 Byte Char 的部份會累加一起算 i: integer; // 4Bytes end; sizeof(TSamele3) = 8; TSamele4 = record s1: String[4]; // 4 1 Byte c1: Char; // 1 Byte Char 的部份會累加一起算 ,所以是 5 1 ==> 變 8 Byte i: integer; // 4Bytes end; sizeof(TSamele4) = 12; [/code] 另發完文後,才發現之前有大大也有說了,也可參考下面這兩篇 http://delphi.ktop.com.tw/topic.php?topic_id=34381 http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=41945
------
價值的展現,來自於你用哪一個角度來看待它!! |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |