記憶體對齊。對下面的類:
class b
};大家可以猜一下類
b物件的大小。如果你猜是18(
4+2+8+4
),也不能說你錯。但是你用
sizeof(b)
一看,結果竟然是
24!多出來的
6個位元組是怎麼回事呢?其實是記憶體對齊搞的鬼。在編譯器的結構成員對齊設定為預設的情況下,分配給各個成員變數的記憶體大小似乎是向佔最大空間的成員變數對齊的(這裡我不敢肯定,還沒看到權威的說法)。在
b類中,首先為
m_a分配空間,編譯器一次為
m_a分配
8個位元組(與最大成員
m_c對齊),實際上
m_a只佔
4個位元組,還有
4個位元組多。接著編譯器為
m_b分配空間,經檢查,
m_b只佔
2位元組,剛好前面還有
4個位元組多,所以
m_b就放在前面多出的那
4個位元組空間中,現在已經為
m_a和
m_b分配了空間,但是
m_a加上
m_b也就只有
6位元組,還有
2個位元組多。如果下面分配的變數剛好是
2位元組的話,那就剛剛好裝滿
8個位元組,沒有浪費空間,可是下面是要為
double
型別的變數分配空間,
m_c佔了
8個位元組,顯然
2個位元組是裝不下的,因此編譯器再為
m_c分配了
8個位元組的空間,剛裝滿。接下來又為
m_d分配空間,根據之前的規則,編譯器分配給
m_d的空間也是
8位元組。這樣看來,編譯器總共為
b的物件分配了
8+8+8=24
位元組的空間。
分配時,以最長位元組(double m_c的8
位元組)為最小分配單元。
sizeof(b)為8
位元組的整數倍。
可能你覺得編譯器這樣做是浪費記憶體空間,但實際上這樣做是很適合
cpu做一些指令操作的,具體是怎樣我不知道,一句話:用空間效率來換時間效率。如果你還是覺得空間比較重要,那麼你可以通過設定編譯屬性或使用編譯器指令
#pragma
來指定編譯器所做的對齊方式,例如語句:
#pragma pack(1)
就是設定向
1位元組對齊。這時使用
sizeof(b)
得出的結果就是
18了。
C 類中的記憶體對齊
在沒有 pragma pack巨集的情況下 1.資料成員對齊規則 struct,union的資料成員,第乙個資料成員放在offset為0的地方,之後的資料成員的儲存起始位置都是放在該資料成員大小的整數倍位置。如在32bit的機器上,int的大小為4,因此int儲存的位置都是4的整數倍的位置開始儲存。...
C 類的記憶體對齊 C alignment
在c 中的某乙個類的記憶體大小是由以下三部分組成 1 nonstatic data member的總和大小 2 alignment所填補的空間,可能存在於members之間,也可能是類的邊界 3 為了支援virtual而由內部產生的額外負擔,比如 指虛基類表的指標或指向虛函式表的指標 其中1和3都比...
C 類 記憶體對齊和類大小理解
首先,預設的塊對齊長度是4位元組,此外也可以通過 pragma pack x 修改,同時,自己修改完之後記得使用 pragma pack 恢復預設值。此外,又分了幾種情況 1 如果有虛函式,則會儲存虛函式表的位址 僅乙個位址,4位元組或8位元組 該位址是存放在類記憶體的最開始的地方。2 如果出現比x...