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