c語言結(jié)構(gòu)體對(duì)齊規(guī)則 結(jié)構(gòu)體成員的字節(jié)對(duì)齊?
結(jié)構(gòu)體成員的字節(jié)對(duì)齊?這個(gè)問題非常嚴(yán)重。首先,我想說的是字節(jié)對(duì)齊的語法在不同的編譯器下是不同的。在GCC中,它是#pragmapush(1)#pragmapack(),在MSC VC中的代碼項(xiàng)可以調(diào)整
結(jié)構(gòu)體成員的字節(jié)對(duì)齊?
這個(gè)問題非常嚴(yán)重。首先,我想說的是字節(jié)對(duì)齊的語法在不同的編譯器下是不同的。在GCC中,它是#pragmapush(1)#pragmapack(),在MSC VC中的代碼項(xiàng)可以調(diào)整,默認(rèn)為8字節(jié);typestruct{charcinti}test byte alignment,是alignment,例如char和int是4字節(jié)對(duì)齊的,那么char會(huì)占用4字節(jié),一共8字節(jié),結(jié)構(gòu)對(duì)象存儲(chǔ)是按順序存儲(chǔ)的,char必須在int前面。在第二種情況下,如果一個(gè)字節(jié)對(duì)齊,則表示char只占用一個(gè)字節(jié),而int將占用四個(gè)字節(jié)。這種n字節(jié)對(duì)齊意味著每個(gè)成員占用的空間必須是n字節(jié)的倍數(shù),小于n字節(jié)的占用n字節(jié)。所以把它和一個(gè)字節(jié)對(duì)齊,它需要五個(gè)字節(jié)。此外,根處理器與您提到的每種數(shù)據(jù)類型的低位還是高位在前面有關(guān)。Intel處理小型端對(duì)齊。例如,整數(shù)522387969用十六進(jìn)制表示為:0x1f230201,在英特爾處理器中表示為0x0102231f,因此內(nèi)存使用0x0102031f來表示522387969,這稱為小端對(duì)齊。但在arm處理器中,522387969表示為0x1f230201,這被稱為大端對(duì)齊,也被稱為網(wǎng)絡(luò)字節(jié)順序。當(dāng)然,上面提到的字節(jié)順序只對(duì)內(nèi)置數(shù)據(jù)類型(如intlongshort)有效。如果結(jié)構(gòu)中有intlong這樣的成員,那么也會(huì)有所謂的字節(jié)順序。如上所述,無論順序是什么,結(jié)構(gòu)對(duì)象都是按順序存儲(chǔ)的。首先定義的成員必須在后面定義的成員之前,但單個(gè)成員具有字節(jié)順序。我不知道怎么說明白嗎?不,請(qǐng)仔細(xì)理解這句話:n字節(jié)對(duì)齊意味著每個(gè)成員占用的空間必須是n字節(jié)的倍數(shù),小于n字節(jié)的占用n字節(jié)。例如,在16位計(jì)算機(jī)中,變量按2字節(jié)對(duì)齊。例如,雖然成員a是char類型,其地址在0x80000000中只有1個(gè)字節(jié),但下一個(gè)成員B不能使用0x80000001的地址,而必須使用0x8000000002的地址,即按字長對(duì)齊。上述結(jié)構(gòu)占用的空間為24 28=16字節(jié)