C語言類型大小總覽
- 編譯器pack指令 #pragma pack(n)——定義n字節對齊
- C++固有類型的對齊取編譯器對齊與自身大小中較小的一個
- 32位C++默認8字節對齊。gcc編譯器默認4字節對齊
- static變量在靜態區,sizeof均不納入計算
- 在編譯階段處理,sizeof作用范圍內的內容不能被編譯,所以sizeof()內的運算不被執行
- sizeof(函數)=sizeof(返回值類型)
- sizeof和strlen:sizeof計算字符串容量,算’\0’,strlen計算字符串長度,到’\0’截止
- 類:非static數據成員變量+虛函數指針+對齊;無論多少個虛函數,都只有一個指向虛函數表的指針(4字節)
- 聯合體:最長成員的大小對齊
- 帶位域:相鄰位域字段的兩個變量若類型相同,當兩個字段位寬和小於此類型大小時,二者緊鄰存儲;若二者位寬和大於本類型大小,則第二個字段從新存儲單元開始,偏移量為其類型大小整數倍。若相鄰位域字段類型不同,則視編譯器決定是否壓縮存儲,VC6不壓縮,Dec-C++壓縮。如果位域字段間穿插着非位域字段,不壓縮。
- 數組:數組占內存字節=元素個數*元素長度; 當數組作為函數參數傳遞時,蛻變成指針
32/64 位系統各類型對照表:
| 字節 |
short |
int |
float |
long |
*(地址) |
double |
long long |
| 32位 |
2 |
4 |
4 |
4 |
4 |
8 |
8 |
| 64位 |
2 |
4 |
4 |
8 |
8 |
8 |
8 |
*有無unsigned修飾都一樣
結構體大小
約定為32位系統,即char 1字節、short 2字節、int 4字節
該問題總結為兩條規律:
1,每個結構體成員的起始地址為該成員大小的整數倍,即int型成員的其實地址只能為0、4、8等
2,結構體的大小為其中最大成員大小的整數倍
struct A{ char a; //1 int b; //空3 + 4 = 7 (規則1) short c; //2+空2=4 (規則2) }; struct B{ char a; //1 short b; //空1 + 2 = 3 (規則1) int c; //4 };
結果是:
sizeof(A)=12 sizeof(B)=8
如果指定了對齊值
#pragma pack(1) struct A{ char a; //1 int b;//4 short c;//2 }; #pragma pack(1) struct B{ char a;//1 short b;//4 int c;//2 };
結果是:
sizeof(A)=7 sizeof(B)=7
參考:
https://blog.csdn.net/EVEcho/article/details/81115683
https://blog.csdn.net/radianceblau/article/details/60867307
