資源描述:
《淺析內(nèi)存對齊》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、淺析內(nèi)存對齊WindowsXPVC6.0環(huán)境下操作,下面的內(nèi)容純屬個人見解,不對的地方,還請指正!一、結構體,下面以8個字節(jié)為標準,進行內(nèi)存對齊(以C++內(nèi)置的數(shù)據(jù)類型為基礎)。structnode{?intarray[10];?inti;?doubled1;?doubled2;?charch;};有的書上面說結構體的大小為所有數(shù)據(jù)成員字節(jié)數(shù)的總和,因為變量在內(nèi)存中分配的空間是由它的類型決定,所以也不能說完全不對,如果大小為所有數(shù)據(jù)成員字節(jié)數(shù)的總和,那么sizeof(node)的值為61,然而結
2、果卻不是這樣,它的值應該為72,這就是結構體中的數(shù)據(jù)成員變量所占內(nèi)存空間被擴充了,使內(nèi)存對齊。具體的計算方法:sizeof(node)=sizeof(array)+sizeof(i)+4+sizeof(d1)+sizeof(d2)+sizeof(ch)+7注意:1、結構體中的數(shù)組元素要當成每個數(shù)據(jù)成員變量來計算。??????????2、在結構中如果兩兩相鄰的兩個數(shù)據(jù)成員都為4個字節(jié),則不需要補到8個字節(jié)。??????????3、如果兩兩相鄰的兩個數(shù)據(jù)成員字節(jié)之和小于8,則需要補到8,,例如:??
3、??????????????structnode????????????????{?????????????????????charch;?????????????????????intj;?????????????????????inti;?????????????????????intk;??????????????????????doubled1;?????????????????????doubled2;?????????????????};?????sizeof(node)=(size
4、of(ch)+sizeof(j))+3+sizeof(i)+sizeof(k)+sizeof(d1)+sizeof(d2)=32?????如果把數(shù)據(jù)成員ch與d2的位置調(diào)換一下,結構體的大小將會變成40?????4、如果單個數(shù)據(jù)成員所占內(nèi)存大小為8個字節(jié),則不需要補齊。?????5、如果兩兩相鄰的數(shù)據(jù)成員字節(jié)之和大于8則要,分情況處理,例如:?????????????structnode?????????????{???????????????????intj;?????????????????
5、??inti;???????????????????intk;???????????????????doubled1;???????????????????doubled2;?????????????};?????k與d1相鄰,則需要把k所占的字節(jié)數(shù)要補齊到8個字節(jié)。?????二、聯(lián)合體unionUNION{?charj;?inti;?doubled;};sizeof(UNION)=8,在聯(lián)合體中,求聯(lián)合體的大小不是所有數(shù)據(jù)成員長度之和,它是以聯(lián)合中最大的數(shù)據(jù)成員為標準。?三、如果一個類中只有數(shù)
6、據(jù)成員,沒有成員函數(shù),那么求這個類的大小也可以用上面求結構體大小的方法來計算。