c++不同數據類型所佔內存大小:
類型 | 32位 | 64位 |
---|---|---|
char | 1 | 1 |
int | 4 | 大多數4,少數8 |
short | 2 | 2 |
long | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
指針 | 4 | 8 |
1,結構體sizeof
一般,結構體sizeof是結構體所有成員大小之和
#include <iostream>
using namespace std;
struct exs1
{
char c1; //char的偏移量爲1的倍數
short s1; //short的偏移量爲2的倍數
int i1;//int爲4的倍數
};
int main()
{
cout<<sizeof(exs1);
return 0;
}
但是爲這裏應該爲7,但是卻爲8:
這是因爲對於結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在存儲結構體變量時的地址對齊問題。
先介紹一個相關的概念——偏移量。偏移量指的是結構體變量中成員的地址和結構體變量地址的差。結構體大小等於最後一個成員的偏移量加上最後一個成員的大小
然而,在實際中,存儲變量時地址要求對齊,編譯器在編譯程序時會遵循兩條原則:
(1)結構體變量中成員的偏移量必須是成員大小的整數倍(0被認爲是任何數的整數倍)
(2)結構體大小必須是最寬基本類型大小的整數倍
上面那個例子中,c1偏移量爲0,爲自身大小的整數倍,滿足條件1。s1偏移量爲1,但是s1大小爲2,不滿足條件1,需要在s1前補1位。i1的偏移量位1+1+2=4,自身大小爲4滿足條件1.則此時的結構體大小爲1+1+2+4=8;且滿足條件2,即結構體的大小爲8
2,共用體union的sizeof
在結構中各成員有各自的內存空間,而在“聯合”中,各成員共享一段內存空間
所以聯合體的sizeof:
(1)爲所有成員中最長的
(2)結構體大小必須是最寬成員大小的整數倍
union u1
{
int i1;
char d1[13];
};
這裏最長的成員變量大小爲d1,如果union長度爲13,滿足條件1,但是這裏最寬的基本類型爲int(4),13不是8的倍數,所以需要填充三個,長度爲16:
union u2
{
int i1;
double d;
};
這個union大小就爲8
3,枚舉的sizeof
enum只是定義了一個常量集合,裏面沒有“元素”,而枚舉類型是當做int來存儲的,所以枚舉類型的sizeof值都爲4