位元組對齊小談

Brainer-Gao發表於2015-12-18

一時興起,忽然想到陣列與結構到底是什麼關係呢?原本結構和陣列沒什麼聯絡。FORTRAN就出現了陣列的概念,結構是在Algol中出現的,C++開始結構成為定義新的資料型別的主要方式。結構在程式語言中的地位是為了讓使用者可以定義整合在一起的一些量,給這個整體一個名字;而陣列是為了表達能表達一連串相同型別的資料的。(翁愷)

總結了一下陣列與結構的聯絡與區別為以下幾點:

區別:

1、結構的內部成員型別可以不一樣,而陣列是一組型別相同的資料的集合;

2、訪問成員的方式不一樣,陣列用[]運算子,結構用.運算子;

3、運算方式中也有區別,結構可以直接賦值,而陣列不行;

4、指標方式不同:結構變數的名字並不是結構變數的地址,必須使用&運算子;

5、作為函式引數傳入函式,處理方式不同。

聯絡:

1、都可以當全域性變數和區域性變數;

2、結構和陣列都是一個容器,它們的出現都是為了程式設計更簡單,更形象化,滿足不同需求。

既然談到結構,那就必須提到位元組對齊,為了能夠更明白的說清楚位元組對齊這個概念,通過模擬實現形象說明,讀者可以自行模擬驗證。

(1)按1位元組對齊

(2)按2位元組對齊

(3)按4位元組對齊

(4)按8位元組對齊

(5)改變結構成員變數型別進行驗證

(6)​再驗證說明

解釋說明:

編譯器中可以設定,本例結構體有char(1個位元組)、short(2個位元組)、int(4個位元組)、double(8個位元組):

1、#pagma pack(1)表示按照1位元組對齊,則結構體中成員之間是連續的,相鄰成員地址的差等於相鄰成員的sizeof,自然而然,結構體的sizeof正好等於全部成員的sizeof之和。

2、#pagma pack(2)、#pagma pack(4)、#pagma pack(8)分別表示按照2位元組、4位元組、8位元組對齊,則結構體中成員之間是不連續的,相鄰成員地址的差也不等於相鄰成員的sizeof,自然而然,結構體的sizeof也不等於全部成員的sizeof之和。對於2個位元組對齊,char需要再補1個位元組,組成2個位元組;而是2個位元組的整數倍的型別則沒有關係;對於4個位元組對齊,char補足兩個位元組,再與short組成4個位元組;對於8個位元組對齊,char補足兩個位元組,再與short組成4個位元組,再與int組成8個位元組。所以三種結果正好是一致的。

3、驗證(1):將int型改為short型,將double型改為int型,用4位元組對齊方式,char補足兩個位元組,再與第一個short組成4個位元組;第二個short需要補2個位元組,組成4個位元組;所以結構體最後結果是12個位元組。

4、驗證(2):結構體中改為char、int、int、double。最後結果為24個位元組。驗證正確,根據結果想想為什麼?想明白了說明你理解了。共勉!

版權所有,轉載請註明來源

程式猿部落格:​http://blog.sina.com.cn/u/2480166565

相關文章