c++進階十一(結構體和共用體,枚舉的sizeof)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章