struct內(nèi)存對齊規(guī)則 如何理解struct的內(nèi)存對齊?
如何理解struct的內(nèi)存對齊?C中的結構對齊問題:結構占用的位數(shù)是數(shù)據(jù)的整數(shù)倍,結構成員占用的位數(shù)最長。在這種結構中,結構占用的比特數(shù)是雙重類型的整數(shù)倍。雖然這種結構使用位場,但對結果沒有影響。In
如何理解struct的內(nèi)存對齊?
C中的結構對齊問題:結構占用的位數(shù)是數(shù)據(jù)的整數(shù)倍,結構成員占用的位數(shù)最長。在這種結構中,結構占用的比特數(shù)是雙重類型的整數(shù)倍。雖然這種結構使用位場,但對結果沒有影響。Int i占用四個字節(jié),char J占用一個字節(jié)。這兩個字節(jié)總共占用八個字節(jié),盡管最后三個字節(jié)是無用的。inta本身占用4個字節(jié),但與結構對齊需要8個字節(jié)。雙B需要8個字節(jié)。字節(jié)總數(shù)為8=24
24(前8個字節(jié)按8字節(jié)對齊,后8個字節(jié)按雙8字節(jié)對齊,字符按8字節(jié)補全=24)
struct PP{int afloat B char D}OO sizeof(OO)12字節(jié)按4字節(jié)對齊
有四個內(nèi)存對齊原則:
1)。數(shù)據(jù)成員對齊規(guī)則:結構(或聯(lián)合)的數(shù)據(jù)成員。第一個數(shù)據(jù)成員放置在偏移量為0的位置。之后,每個數(shù)據(jù)成員存儲的起始位置從成員大小或其子成員大小的整數(shù)倍開始(只要成員有子成員,如數(shù)組、結構等)(例如,如果在32位計算機中int是4字節(jié),則應從4的整數(shù)倍地址開始存儲)?;绢愋筒话╯truct/class/Uinon。
2) . struct as member:如果一個結構中有一些結構成員,那么應該從結構中“最寬的基本類型成員”的整數(shù)倍地址存儲結構成員。(結構a包含結構B,而B包含char、int、double和其他元素,那么B應該從8的整數(shù)倍存儲。)。
3) . 收尾工作:結構的總尺寸,即sizeof的結果,必須是結構內(nèi)部最大構件的“最寬基本型構件”的整數(shù)倍。彌補不足。(基本類型不包括struct/class/Uinon)。
4) . sizeof(Union),結構中最大的元素是Union的大小,因為在特定時間,只有Union的一個成員實際存儲在地址中。