c語言怎么對齊數(shù)字 結(jié)構(gòu)體成員的字節(jié)對齊?
結(jié)構(gòu)體成員的字節(jié)對齊?這個問題非常嚴(yán)重。首先,我想說的是字節(jié)對齊的語法在不同的編譯器下是不同的。在GCC中,它是#pragmapush(1)#pragmapack(),在MSC VC中的代碼項可以調(diào)整
結(jié)構(gòu)體成員的字節(jié)對齊?
這個問題非常嚴(yán)重。首先,我想說的是字節(jié)對齊的語法在不同的編譯器下是不同的。在GCC中,它是#pragmapush(1)#pragmapack(),在MSC VC中的代碼項可以調(diào)整,默認(rèn)為8字節(jié);typestruct{charcinti}test byte alignment,是alignment,例如char和int是4字節(jié)對齊的,那么char會占用4字節(jié),一共8字節(jié),結(jié)構(gòu)對象存儲是按順序存儲的,char必須在int前面。在第二種情況下,如果一個字節(jié)對齊,則表示char只占用一個字節(jié),而int將占用四個字節(jié)。這種n字節(jié)對齊意味著每個成員占用的空間必須是n字節(jié)的倍數(shù),小于n字節(jié)的占用n字節(jié)。所以把它和一個字節(jié)對齊,它需要五個字節(jié)。此外,根處理器與您提到的每種數(shù)據(jù)類型的低位還是高位在前面有關(guān)。Intel處理小型端對齊。例如,整數(shù)522387969用十六進(jìn)制表示為:0x1f230201,在英特爾處理器中表示為0x0102231f,因此內(nèi)存使用0x0102031f來表示522387969,這稱為小端對齊。但在arm處理器中,522387969表示為0x1f230201,這被稱為大端對齊,也被稱為網(wǎng)絡(luò)字節(jié)順序。當(dāng)然,上面提到的字節(jié)順序只對內(nèi)置數(shù)據(jù)類型(如intlongshort)有效。如果結(jié)構(gòu)中有intlong這樣的成員,那么也會有所謂的字節(jié)順序。如上所述,無論順序是什么,結(jié)構(gòu)對象都是按順序存儲的。首先定義的成員必須在后面定義的成員之前,但單個成員具有字節(jié)順序。我不知道怎么說明白嗎?不,請仔細(xì)理解這句話:n字節(jié)對齊意味著每個成員占用的空間必須是n字節(jié)的倍數(shù),小于n字節(jié)的占用n字節(jié)。如果大于n字節(jié),它將構(gòu)成n字節(jié)的倍數(shù)。例如,如果按3字節(jié)對齊,則4字節(jié)int將占用6字節(jié)。對齊與數(shù)據(jù)在內(nèi)存中的位置有關(guān)。如果變量的內(nèi)存地址是其長度的整數(shù)倍,則稱為自然對齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對齊。字節(jié)對齊的根本原因是CPU訪問數(shù)據(jù)的效率。假設(shè)上面整數(shù)變量的地址不是自然對齊的,例如0x00000002,那么CPU需要訪問內(nèi)存兩次,如果它接受它的值。第一次從0x00000002-0x00000003取短,第二次從0x00000004-0x00000005取短,然后合并得到所需的數(shù)據(jù)。如果變量的地址為0x00000003,則需要訪問內(nèi)存三次,第一次訪問char,第二次訪問簡稱char,第三次訪問char,然后合并得到整數(shù)數(shù)據(jù)。如果變量處于自然對齊位置,則只能檢索一次數(shù)據(jù)。有些系統(tǒng)對對齊非常嚴(yán)格,如SPARC系統(tǒng)。如果獲取未對齊的數(shù)據(jù),則會發(fā)生錯誤。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在運(yùn)行時會報告為段錯誤,而X86上不會有錯誤,但效率會降低。
結(jié)構(gòu)體字節(jié)對齊原則?
[structure PP{int afloat B char D}OO sizeof(OO)12字節(jié)