自訂型別的資料長度到底是多長?


Q: 有一資料結構及變數 X, 定義如下,問 Len(X)=? LenB(X)=?
Type StructX
    A As Byte
    B As Long
End Type

Dim X As StructX
A: 在以上的 StructX 資料結構中, Byte 的長度等於 1 個位元組, Long 的長度等於 4 個位元組, 所以利用 StructX 所定義出來的 X 其資料之長度應該等於 5, 照此推論, Len(X) 及 LenB(X) 都應該等於 5, 但實際上, 答案是卻 Len(X) = 5, LenB(X) = 8, 為什麼會這樣呢?

應該這麼說吧, Len 函數在讀取資料的長度, 所以 Len(X) 等於 5 並沒有什麼奇怪的, 而 LenB 函數則在讀取資料所佔用記憶體之長度, 那麼為什麼 LenB(X) 等於 8 呢? 對於 32-bits 的作業系統而言, 每次存取 32-bits(等於 4 bytes) 其執行效能是最高的, 所以在記憶體的安排上, 也盡可能以 4 bytes 為一單元, 以 StructX 為例, A 佔用 1 Bytes, 接下來剩餘 3 Bytes, 但不足於容納 B, 因此 Windows 便捨棄此 3 Bytes 不用,而將 B 放在下一個 4 Bytes 的位置, 而出現以下的結果:

所以 LenB(X) 便等於 8。

知道 Len(X) = 5 而 LenB(X) = 8 之後, 對於程式的撰寫有什麼影響呢? 首先請注意, 雖然 X 佔用了 8 Bytes 的記憶體, 如果將 X 寫入檔案中,它所佔用的長度還是等於 Len(X)=5。

由於我們可以正確地知道記憶體的安排, 所以在資料結構的宣告上, 就可以採用比較節省記憶體的方式, 請比較以下兩種宣告方式:

    Type StructA
        X1 As Byte
        X2 As Long
        X3 As Byte
        X4 As Long
    End Type
    Type StructB
        X1 As Byte
        X3 As Byte
        X2 As Long
        X4 As Long
    End Type

結果 StructA 所佔用的記憶體是 16 Bytes, 而 StructB 所佔用的記憶體則是 12 Bytes, 因此, 選擇 StructB 是比較節省記憶體的方式。