我們通過幾個例子來全面搞懂c/c++中的記憶體對齊問題。來看看下面的結構體大小分別是多大?(假設均在32位機器上)
struct a ;
這個相信大家都知道,由於變數都是char型別,對齊值為1,所以結構體大小為3。
struct b ;
對齊值為4,結構體大小為:4+4=8。(第乙個4為int,第二個4裡面包含乙個1位元組的char型變數b和乙個2位元組的short變數c,還有乙個位元組是空餘的)
struct c ;
對齊值為4,結構體大小為:4+4+4=12。(第乙個為char,空餘3個位元組,第二個為int,第三個為short,空餘2個位元組)
對齊值為2。(這是因為使用了#pragma pack(2)指定了對齊值)結構體大小為:2+4+2=8。(第乙個是char,空餘1個位元組,第二個為int,第三個為short)#pragma pack(2)
struct d ;
c c 中的記憶體對齊
32位linux 下 class a char c1 sizeof a 1 而非 4,這點有點出乎意料!按照對齊要求,在32位環境中預設的對齊是按照4位元組來的,但是這裡似乎沒有表現出4位元組的對齊要求!class b這樣定義 class b char c1 short s1 這個時候sizeof ...
C C 記憶體對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...
C C 記憶體對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...