结构体变量字节填充
二:
(1)sizeof也可以對(duì)一個(gè)函數(shù)調(diào)用求值,其結(jié)果是函數(shù)返回類型的大小,函數(shù)并不會(huì)被調(diào)用。
(2)終于搞懂struct結(jié)構(gòu)體內(nèi)存分配問(wèn)題了,結(jié)構(gòu)體中各個(gè)成員字節(jié)對(duì)齊遵循以下幾個(gè)原則: 直接用下面幾個(gè)原則即可判斷結(jié)構(gòu)體的大小
1.結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是(這個(gè))成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internaladding);
例如有以下一個(gè)結(jié)構(gòu)體
structex { int i; char t; int n; }第1個(gè)成員偏移量為0,是int型成員大小4(假設(shè)這太機(jī)器的整型長(zhǎng)度占4個(gè)字節(jié))的整數(shù)倍。
第2個(gè)成員t為char型,他的大小為1,首先假設(shè)在成員i和t之間沒(méi)有填充字節(jié),由于i是整型,占4個(gè)字節(jié)那么在沒(méi)有填充之前,第2個(gè)成員t相對(duì)于結(jié)構(gòu)體的偏移量為4,他是t成員大小1的4倍,符合此條件,所以系統(tǒng)在給結(jié)構(gòu)體第2個(gè)成員分配內(nèi)存時(shí),不會(huì)在i和t之間填充字節(jié)以到達(dá)對(duì)齊的目的。
當(dāng)分配結(jié)構(gòu)體第3個(gè)成員n時(shí),首先發(fā)現(xiàn)是一個(gè)整型數(shù)據(jù),大小為4,沒(méi)有填充之前,n相對(duì)于結(jié)構(gòu)體首地址偏移量為:前面2個(gè)成員+填充字節(jié)=5,所以當(dāng)系統(tǒng)發(fā)現(xiàn)5不是4(成員大小)的整數(shù)倍時(shí),會(huì)在成員t之后(或者說(shuō)n之前)填充3個(gè)字節(jié),以使n的偏移量到達(dá)8而成為4的整數(shù)倍。這樣這個(gè)結(jié)構(gòu)體占用內(nèi)存情況暫時(shí)為4+1+3+4。
2.結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailingpadding)。
上面的結(jié)構(gòu)體內(nèi)存分配以后還要看是否滿足此條件,假設(shè)在最末一個(gè)成員之后不需填充字節(jié)數(shù),那么這個(gè)結(jié)構(gòu)體的大小為12。而ex結(jié)構(gòu)體中最寬基本類型成員為int,大小為4,12為4的整數(shù)倍,所以無(wú)須再在最末一個(gè)成員之后加上填充字節(jié)了。所以sizeof(ex)=12;
如果一個(gè)結(jié)構(gòu)體如下所示
struc tex1{ int i; char t; int n; char add; }那么sizeof(ex1)=16;原因就是在最后一個(gè)成員之后填充了3個(gè)字節(jié)。
3.還有一個(gè)額外的條件:結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;
4.對(duì)于結(jié)構(gòu)體成員屬性中包含結(jié)構(gòu)體變量的復(fù)合型結(jié)構(gòu)體再確定最寬基本類型成員時(shí),應(yīng)當(dāng)包括復(fù)合類型成員的子成員。但在確定復(fù)合類型成員的偏移位置時(shí)則是將復(fù)合類型作為整體看待。
5總結(jié)出一個(gè)公式:結(jié)構(gòu)體的大小等于最后一個(gè)成員的偏移量加上其大小再加上末尾的填充字節(jié)數(shù)目,即:
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) +sizeof( trailing padding )
轉(zhuǎn)載于:https://www.cnblogs.com/qdrs/p/7705385.html
總結(jié)
 
                            
                        - 上一篇: 广发银行信用卡“样样行”消费分期手续费多
- 下一篇: 一介书生,仅此而已
