2007年3月22日 星期四

packed record 與 record 的差別!

宣告記錄型態(record),預設的編譯方式會將各欄佔用的記憶體長度以方便CPU存取的方式向word或double-word佔用空間大小對齊,以得到較佳的存取速度。
如果宣告時使用packed record,則按照實際各欄佔用空間配置,但存取速度較差。

例如:
沒有特別調整 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接軌, 硬體控制),
就可能需要使用..

參考: http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=34381

沒有留言: