c++中利用sizeof运算符计算结构体大小问题探讨
c++中提供的sizeof運算符可以方便得計算出內置類型的字節數大小,比如sizeof(int),sizeof(char),sizeof(double)的返回值分別為4,1,8,這是很容易理解的。但是將sizeof運算符用于計算結構體變量所占內存大小時,情況可能會出乎意料。
比如,我們這里定義一個結構體如下:
1 typedef struct2
3 {
4
5 int a;
6
7 char b;
8
9 }struct1;
?
我們按照常理計算一下,int類型的變量為4字節,char類型的變量為1字節,那么一個struct1類型的變量肯定就為5字節,是兩個成員的相加,但是在程序中實驗后,我們發現,實際上sizeof(struct1)的值為8,著實讓人疑惑。
其實,結構體在被編譯器編譯的時候,它所占據的內存空間的大小是根據編譯器來決定的,我們可以利用編譯器的預編譯指令來得到這個默認值。在VS2008中加入#pragma pack(show)后,編譯工程文件時就會出現這樣的提醒:
warning C4810: 雜注 pack(show) 的值 == 8。
這個就是編譯器默認的編譯結構體時其數據成員的對齊方式。對齊方式可以理解為編譯結構體時每次為其數據成員分配的內存空間的大小。如果這個分配的8字節內存用完了,那么就另外分配一塊8字節的空間來繼續為結構體的數據成員指定位置。比如上段代碼中,首先OS分配一個8字節的內存空間給結構體,先把?int a 這個數據成員裝進去,int型為4字節,這時還剩下4個字節,這足夠裝下一個char類型的 char b,所以這8個字節的內存空間中實際上有值的只有前5個字節,而后三個字節是沒有放任何東西的,但是在計算這個結構體的大小時還是要計算入內,所以這個結構體的大小就是8字節。
為了驗證這個結論的正確性,我們再來看幾個例子:
1 typedef struct2 {
3 int a;
4 double b;
5 }struct2;
在這個結構體中定義了一個整型和一個雙精度浮點型,所占的內存空間大小分別為4和8字節。編譯器默認的對齊方式為8。首先,OS為其分配一個8字節的空間,?int a先裝進去,這時只剩下4字節的剩余空間,放不下double b了,所以OS再為其分配一個8字節的空間,將double b裝進去,所以得到的struct2類型的字節大小就是16。
再看:
1 typedef struct2 {
3 int a;
4 char a[6];
5 double c;
6 }struct3;
這個結構體中有一個char a[6],數組的大小就是一個順序存儲的順序結構,它的字節大小就是數組中每個成員的大小乘以數組的長度,這里為6字節。首先分配一個6字節的內存空間,先裝下int a,由于char a[6]為6字節,所以剩下的4字節裝不下,就再分配8字節,用來裝下char[6]。還剩下2字節裝不下double c,所以再分配8字節用來裝它,所以結構體struct3的字節大小就為24字節。
轉載于:https://www.cnblogs.com/hongfenglee/archive/2012/02/17/2355141.html
總結
以上是生活随笔為你收集整理的c++中利用sizeof运算符计算结构体大小问题探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辨析Java与Javascript
- 下一篇: before伪类的超有用应用技巧——水平