1)列舉類enum型空間計算
enum只是定義了乙個常量集合,裡面沒有「元素」,而列舉型別是當做int來儲存的,所以列舉型別的sizeof值都為4
1 enumcolor(red,pink,white,black)c;2)公用體union空間計算2 voidmain()
3
公用體中的成員公用同一段記憶體,所以整個聯合體的sizeof是所有成員中占用記憶體最大的成員的sizeof,聯合體要考慮記憶體對齊,具體規則下面會講
1 union sts;結果分析:sizeof(a)=9*1=9,sizeof(b)=2*4=8,選兩者中最大的乙個,即9,考慮記憶體對齊,整體空間長度要是公用體中長度最大的資料型別的整數倍,在這裡是int占用空間的整數倍,比9大的且是4的整數倍的最小數是125 voidmian()
6
3)結構體struct空間計算
1.整體空間是結構體中占用空間最大的型別所佔位元組數的整數倍。特殊:在32位linux+gcc環境下,若最大的型別所佔位元組數超過4,如double是8,則整體空間大小是4的整數倍即可
2.資料對齊原則-記憶體按結構體成員的先後順序排列,當排到該成員變數時,其前面所有成員已經占用的空間大小必須是該成員型別大小的整數倍,如果不夠,則前面的成員占用的空間要補齊,使之成為當前成員型別的整數倍。特殊:在linux+gcc環境下,若當前成員型別位元組數超過4,則前面所有成員已經占用的空間大小是4的整數倍即可,不夠則補齊
範例:
1 structs;結果分析:首先s中最大的型別為double,長度為8;順序存放s中的成員,sizeof(a)=1,占用乙個位元組,下乙個成員b是double型別,占用8個位元組,根據原則2,a占用的記憶體補齊8的整數倍,即補齊到8個位元組,b從第9個位元組開始存放,此時共占用16個位元組,下乙個成員c是int型別,占用4個位元組,16是4的整數倍,不用補齊,順序存放c,此時占用空間來到20,d占用乙個位元組,20+1=21,根據原則1,整體空間大小需是double型別長度的整數倍,需將21補齊到24個位元組7 voidmain()
8
規則同上面基本相同,但計算時,設計到的倍數對齊,以子結構體中的最大成員型別占用的空間為基礎,而不是將子結構體的整體空間為基礎,具體如下:
1.整體空間是子結構體與父結構體中占用空間最大的型別所佔位元組數的整數倍。特殊:在32位linux+gcc環境下,若最大的型別所佔位元組數超過4,如double是8,則整體空間大小是4的整數倍即可
2.資料對齊原則-記憶體按結構體成員的先後順序排列,當排到子結構體成員時,其前面所有成員已經占用的空間大小必須是該子結構體成員中占用空間最大的型別大小的整數倍,如果不夠,則前面的成員占用的空間要補齊,使之成為該型別大小的整數倍。特殊:在linux+gcc環境下,若當前成員型別位元組數超過4,則前面所有成員已經占用的孔家大小是4的整數倍即可,不夠則補齊
1 structs1;結果分析:5
6 structs2;
11
12 voidmian()
13
s1:c佔乙個位元組,i佔4個位元組,存放i之前將其補齊到4個位元組,i從第5個位元組開始存放,此時整體空間大小是8,恰好是4的整數倍
s2:c1佔乙個位元組,下乙個成員s,這裡sizeof(s)雖然等於8,但計算時前面占用空間只要是s中最大型別的空間長度的整數倍即可,s中最大型別是int,所以c1占用的記憶體補齊到4,然後存放s(注意這裡存放的是s,而不是int占用的位元組),已計算出sizeof(s)=8,此時整體空間來到12,c2佔乙個位元組,12+1=13,根據原則1,整體空間大小需是父結構體和子結構體重最大型別長度int的整數倍,最近的是16.
1)列舉類enum型空間計算
enum只是定義了乙個常量集合,裡面沒有「元素」,而列舉型別是當做int來儲存的,所以列舉型別的sizeof值都為4
1 enumcolor(red,pink,white,black)c;2)公用體union空間計算2 voidmain()
3
公用體中的成員公用同一段記憶體,所以整個聯合體的sizeof是所有成員中占用記憶體最大的成員的sizeof,聯合體要考慮記憶體對齊,具體規則下面會講
1 union sts;結果分析:sizeof(a)=9*1=9,sizeof(b)=2*4=8,選兩者中最大的乙個,即9,考慮記憶體對齊,整體空間長度要是公用體中長度最大的資料型別的整數倍,在這裡是int占用空間的整數倍,比9大的且是4的整數倍的最小數是125 voidmian()
6
3)結構體struct空間計算
1.整體空間是結構體中占用空間最大的型別所佔位元組數的整數倍。特殊:在32位linux+gcc環境下,若最大的型別所佔位元組數超過4,如double是8,則整體空間大小是4的整數倍即可
2.資料對齊原則-記憶體按結構體成員的先後順序排列,當排到該成員變數時,其前面所有成員已經占用的空間大小必須是該成員型別大小的整數倍,如果不夠,則前面的成員占用的空間要補齊,使之成為當前成員型別的整數倍。特殊:在linux+gcc環境下,若當前成員型別位元組數超過4,則前面所有成員已經占用的空間大小是4的整數倍即可,不夠則補齊
範例:
1 structs;結果分析:首先s中最大的型別為double,長度為8;順序存放s中的成員,sizeof(a)=1,占用乙個位元組,下乙個成員b是double型別,占用8個位元組,根據原則2,a占用的記憶體補齊8的整數倍,即補齊到8個位元組,b從第9個位元組開始存放,此時共占用16個位元組,下乙個成員c是int型別,占用4個位元組,16是4的整數倍,不用補齊,順序存放c,此時占用空間來到20,d占用乙個位元組,20+1=21,根據原則1,整體空間大小需是double型別長度的整數倍,需將21補齊到24個位元組7 voidmain()
8
規則同上面基本相同,但計算時,設計到的倍數對齊,以子結構體中的最大成員型別占用的空間為基礎,而不是將子結構體的整體空間為基礎,具體如下:
1.整體空間是子結構體與父結構體中占用空間最大的型別所佔位元組數的整數倍。特殊:在32位linux+gcc環境下,若最大的型別所佔位元組數超過4,如double是8,則整體空間大小是4的整數倍即可
2.資料對齊原則-記憶體按結構體成員的先後順序排列,當排到子結構體成員時,其前面所有成員已經占用的空間大小必須是該子結構體成員中占用空間最大的型別大小的整數倍,如果不夠,則前面的成員占用的空間要補齊,使之成為該型別大小的整數倍。特殊:在linux+gcc環境下,若當前成員型別位元組數超過4,則前面所有成員已經占用的孔家大小是4的整數倍即可,不夠則補齊
1 structs1;結果分析:5
6 structs2;
11
12 voidmian()
13
s1:c佔乙個位元組,i佔4個位元組,存放i之前將其補齊到4個位元組,i從第5個位元組開始存放,此時整體空間大小是8,恰好是4的整數倍
s2:c1佔乙個位元組,下乙個成員s,這裡sizeof(s)雖然等於8,但計算時前面占用空間只要是s中最大型別的空間長度的整數倍即可,s中最大型別是int,所以c1占用的記憶體補齊到4,然後存放s(注意這裡存放的是s,而不是int占用的位元組),已計算出sizeof(s)=8,此時整體空間來到12,c2佔乙個位元組,12+1=13,根據原則1,整體空間大小需是父結構體和子結構體重最大型別長度int的整數倍,最近的是16.
結構體,公用體,列舉型別的sizeof
1 列舉類enum型空間計算 enum只是定義了乙個常量集合,裡面沒有 元素 而列舉型別是當做int來儲存的,所以列舉型別的sizeof值都為4 1 enum color red,pink,white,black c 2void main 3 2 公用體union空間計算 公用體中的成員公用同一段記...
結構體 共用體 列舉
結構體 共用體 列舉 分析 首先宣告的結構體元素year的位址是最低的 0012ff74 而最後宣告的day的位址是最高的 0012ff7c 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...
列舉,結構體,共用體
列舉的定義 enum log level dbg,inf,war,err,fat,all,offvoid writeinfor log level level switch level case dbg printf d n dbg 上述定義的列舉型別,預設為dbg 0,inf 1,依次類推。1 列...