全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5493
推到 Plurk!
推到 Facebook!

Packed Record 與 Record 的差別

 
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-28 17:23:56 IP:218.210.xxx.xxx 訂閱
先說明 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
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-07-28 17:29:59, 註解 無‧
careychen 重新編輯於 2008-07-28 17:45:46, 註解 加入2篇文章連結‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-29 14:15:42 IP:61.222.xxx.xxx 訂閱
原來有差,都沒什麼在注意。
感謝!
系統時間:2024-04-20 6:56:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!