共用體所佔記憶體大小:共用體所佔記憶體的大小即公用體中長度最大元素所占用的位元組數。
方法一:
結構體的記憶體大小=最後乙個成員的偏移量 + 最後乙個成員的大小 + 末尾的填充位元組數
例.1:
struct data
比如說這個成員a,由於a是第乙個成員,所以它的位址就是結構體的首地
址,它相對於結構體的首位址的偏移就是零。
第二個成員b,b成員距離結構體的首位址隔了乙個變數a的大小,所以b的
偏移量為4.那麼結構體做位元組對齊的時候有這樣乙個準測:
*每乙個成員相對於結構體首位址的偏移量都得是當前成員所佔大小的整
數倍,如果不是編譯器就會在成員之間加上填充位元組。*
b的位元組數是4,它的偏移量是1.這個時候,它的偏移量是1,1不是4的整
數倍,所以編譯器就是在a成員的後面做乙個位元組填充,讓從b的偏移量變
成4位元組,這個時候b的偏移量就是b自身位元組大小4的倍數了。
那麼,現在再看一下c,對c來說,它的自身大小也是8位元組,它目前的偏移量是4(b的偏移量)+4(b的大小)=8,8是c自身大小8的倍數,所以這裡編譯器不會在成員b和c之間填充位元組。
此時c的偏移量 + c的位元組大小 = 8 + 8 =16
此時還沒有結束,編譯器還要去判斷,現在的結構體總大小是不是結構體中最寬的基本型別成員大小的整數倍(按整個結構對對齊,整個結構體的對齊值通常是結構體中最大資料型別所佔的空間)。
此結構體中的最大資料型別為double,位元組大小為8,16是8的倍數,所以c後面無需填充位元組,即末尾的填充位元組數為零。
//一般來說,結構的對齊準測是:先按資料型別自身進行對齊,然後再按照整個結構體進行對齊。(兩個)對齊。
如果乙個型別先按自身n位元組進行對齊,那麼該型別的偏移量得是自身位元組數的整數倍。資料自身的對齊值通常就是資料所佔的空間大小。整個結構的對齊值一般是結構體中最大資料型別所佔的空間大小。
共用體和結構體所佔記憶體大小的計算方法二
乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 void main 比如例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 si...
共用體Union的記憶體大小
下例表示宣告乙個共用體foo union foo int i char c double k 再用已宣告的共用體可定義共用體變數。例如用上面說明的共用體定義乙個名為bar的共用體變數,可寫成 union foo bar 在共用體變數bar中,整型變數i和字元變數c共用同一記憶體位置。當乙個共用體被宣...
結構體和共用體的記憶體對齊
編譯器按照成員列表的順序乙個接乙個地給每個成員分配記憶體。只有當儲存成員時需要滿足正確的邊界對齊要求時,成員時間才可能出現用於填充的額外記憶體空間。系統禁止編譯器在乙個結構的起始位置跳過幾個位元組來滿足邊界對齊要求,因此所有結構的起始位置必須是結構中邊界要求最嚴格的資料所要求的位置。這段話來自 c和...