用对齐原则求结构体长度
用對齊原則求結構體長度
| [日期:2009-09-18] | 來源:中嵌信息? 作者:chinaeda-news | [字體:大 中 小] |
| ?size of int is: 4 sizeof 指針 is 4; |
??? 2. 結構體長度求法:
??? a.成員都相同時(或含數組且數組數據類型同結構體其他成員數據類型):
??? 結構體長度=成員數據類型長度×成員個數(各成員長度之和);
??? 結構體中數組長度=數組數據類型長度×數組元素個數;
??? b.成員不同且不含其它結構體時;
??? (1)分析各個成員長度;
??? (2)找出最大長度的成員長度M(結構體的長度一定是該成員的整數倍);
??? (3)并按最大成員長度出現的位置將結構體分為若干部分;
??? (4)各個部分長度一次相加,求出大于該和的最小M的整數倍即為該部分長度
??? (5)將各個部分長度相加之和即為結構體長度
??? c含有其他結構體時:
??? (1)分析各個成員長度;
??? (2)對是結構體的成員,其長度按b來分析,且不會隨著位置的變化而變化;
??? (3)分析各個成員的長度(成員為結構體的分析其成員長度),求出最大值;
??? (4)若長度最大成員在為結構體的成員中,則按結構體成員為分界點分界;
??? 其他成員中有最大長度的成員,則該成員為分界點;
??? 求出各段長度,求出大于該和的最小M的整數倍即為該部分長度
??? (5)將各個部分長度相加之和即為結構體長度
??? 舉例來說:
| ?1. struct test1 { int a; int b[4]; }; sizeof(test1)=sizeof(int)+4*sizeof(int)=4+4*4=20; 2. struct test2 { char a; int b; double c; bool d; }; |
??? 分析:該結構體最大長度double型,長度是8,因此結構體長度分兩部分:
??? 第一部分是a、 b、 c的長度和,長度分別為1,4,8,則該部分長度和為13,取8的大于13的最小倍數為16;
??? 第二部分為d,長度為1,取大于1的8的最小倍數為8,
??? 兩部分和為24,故sizeof(test2)=24;
| ?3. struct test3 { char a; test2 bb;//見上題 int cc; } |
??? 分析:該結構體有三個成員,其中第二個bb是類型為test2的結構體,長度為24,且該結構體最大長度成員類型為double型,以后成員中沒有double型,所以按bb分界為兩部分:
??? 第一部分有a 、bb兩部分,a長度為1,bb長度為24,取8的大于25的最小倍數32;
??? 第二部分有cc,長度為4,去8的大于4的最小倍數為8;
??? 兩部分之和為40,故sizeof(test3)=40;
| ?4. struct test4 { char a; int b; }; struct test5 { char c; test4 d; double e; bool f; }; 求sizeof(test5) |
??? 分析:test5明顯含有結構體test4,按例2容易知道sizeof(test4)=8,且其成員最大長度為4;則結構體test5的最大成員長度為8(double 型),所以e是分界點,分test5為兩部分:
??? 第一部分由c 、d、e組成,長度為1、8、8,故和為17,取8的大于17的最小倍數為24;
??? 第二部分由f組成,長度為1,取8的大于1的最小倍數為8,
??? 兩部分和為32,故sizeof(test5)=24+8=32;
??? 在VC6.0下程序驗證 結果是正確的。
?
|
總結
以上是生活随笔為你收集整理的用对齐原则求结构体长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数调用约定
- 下一篇: 用户自定义类型(User-defined