C++內存對齊

考慮下面兩個例子:

1,

struct A

{

       char a;

       int    b;

       int    c;

       char d;

}


struct B

{

      int a;

      char b;

      char c;

}

sizeof(A) = ?;

sizeof(B) = ?;

帶着這兩個問題我們補充一下理論。

舉個例子,如果0x02~0x05存了一個int,讀取這個int就需要先讀0x01~0x04,留下0x02~0x04的內容,再讀0x05~0x08,留下0x05的內容,兩部分拼接起來才能得到那個int的值,讀一個int就要兩次內存訪問,效率就低了……如果內存對齊了只需要一次訪問內存就可以讀到一個int了,所以內存對齊是爲了提高效率的。那怎麼計算像結構體這樣的大小呢,借用一下別人總結的三大步:

1、首先要弄清成員變量有效對齊方式的值 N

這裏面有四個概念值:
   1)數據類型自身的對齊值:就是上面交代的基本數據類型的自身對齊值。

   2)指定對齊值:#pragma pack (value)時的指定對齊值value。

   3)結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

   4)數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的那個值。

2、每個成員的起始地址應滿足 “起始地址%N = 0”

3、根據結構體的有效對齊值圓整(就是結構體成員變量佔用總長度需要是對結構體有效對齊值的整 數倍)

所以sizeof(A)等於1+(3)+4+4+1+(3)。

sizeof(B)等於4+1+1+(2)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章