C語言各類型大小,結構體大小 sizeof(struct A)


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM