天天看點

結構體在記憶體中所占位元組大小計算

作者 :卿笃軍

今天上課,老師給我們示範了一下,計算結構體在記憶體中所占的位元組大小。開始給了我們幾個例子,然後要我們自己摸索出規律。

注:以下測試全是在win7_64bit  devcpp 5.5.3環境下測試的。(char 1位元組,int 4位元組, double 8位元組)。

也許:你可能認為下面這個答案是 1+4 = 5   (×)

其實,這個題目的答案是: 8 (√)

這牽涉到一個 結構體位元組對齊問題 ,具體結構體為什麼要位元組對齊,又是如何對齊的,可以參考下面的兩篇文章(我網上搜的):

1.海闊憑魚躍,天高任鳥飛的部落格專欄,結構體在記憶體中所占空間大小的計算,

2.eliot的部落格專欄,結構體位元組對齊,

       在用sizeof運算符求算某結構體所占空間時,并不是簡單地将結構體中所有元素各自占的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對于任何變量的通路都可以從任何位址開始通路,但是事實上不是如此,實際上通路特定類型的變量隻能在特定的位址通路,這就需要各個變量在空間上按一定的規則排列,而不是簡單地順序排列,這就是記憶體對齊。

      記憶體對齊的原因:

      1)某些平台隻能在特定的位址處通路特定類型的資料;

      2)提高存取資料的速度。比如有的平台每次都是從偶位址處讀取資料,對于一個int型的變量,若從偶位址單元處存放,則隻需一個讀取周期即可讀取該變量;但是若從奇位址單元處存放,則需要2個讀取周期讀取該變量。

我們以例子來說明對齊方式吧:

輸出結果: 8

解釋:結構體中(注意變量定義的順序),char 是1個位元組,int 是4 個位元組,結構體位元組對齊:char 和 int對齊。是以将char補齊到4個位元組。

是以最後結構體所占位元組: 4 + 4 = 8;

輸出結果: 12

解釋:結構體中char a[4],已經和下面的int 對齊了,可是還剩下一個char a[1]這個也需要補齊到int (4)。

是以最後結果: 8 + 4 = 12

輸出結果: 16

解釋:結構體中char , int 兩個位元組數(整體),與下面的double對齊。是以char ,int 整體位元組數要湊夠8 。

是以最後結果: 8 + 8 = 16

輸出結果: 24

解釋:比較例三,我們發現隻是結構體裡面的定義順序改變了,卻造成了結果的不同。那麼這是為什麼呢?

其實是這樣的,上面的char 要和double對齊,是以char 位元組要補齊到double(8),然後double不可能和下面的int對齊吧?因為double本來就比int大,是以不可能對齊,那麼就隻有int和double對齊了哦,是以int也要補齊到double(8)。

是以最後結果: 8 + 8 + 8 = 24