c語(yǔ)言struct字節(jié)對(duì)齊 結(jié)構(gòu)體字節(jié)對(duì)齊原則?
結(jié)構(gòu)體字節(jié)對(duì)齊原則?對(duì)齊與內(nèi)存中數(shù)據(jù)的位置有關(guān)。如果變量的內(nèi)存地址是其長(zhǎng)度的整數(shù)倍,則稱(chēng)為自然對(duì)齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對(duì)齊。字節(jié)對(duì)齊的根本原因是
結(jié)構(gòu)體字節(jié)對(duì)齊原則?
對(duì)齊與內(nèi)存中數(shù)據(jù)的位置有關(guān)。如果變量的內(nèi)存地址是其長(zhǎng)度的整數(shù)倍,則稱(chēng)為自然對(duì)齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對(duì)齊。字節(jié)對(duì)齊的根本原因是CPU訪問(wèn)數(shù)據(jù)的效率。假設(shè)上面整數(shù)變量的地址不是自然對(duì)齊的,例如0x00000002,那么CPU需要訪問(wèn)內(nèi)存兩次,如果它接受它的值。第一次從0x00000002-0x00000003取短,第二次從0x00000004-0x00000005取短,然后合并得到所需的數(shù)據(jù)。如果變量的地址為0x00000003,則需要訪問(wèn)內(nèi)存三次,第一次訪問(wèn)char,第二次訪問(wèn)簡(jiǎn)稱(chēng)char,第三次訪問(wèn)char,然后合并得到整數(shù)數(shù)據(jù)。如果變量處于自然對(duì)齊位置,則只能檢索一次數(shù)據(jù)。有些系統(tǒng)對(duì)對(duì)齊非常嚴(yán)格,如SPARC系統(tǒng)。如果獲取未對(duì)齊的數(shù)據(jù),則會(huì)發(fā)生錯(cuò)誤。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在運(yùn)行時(shí)會(huì)報(bào)告為段錯(cuò)誤,而X86上不會(huì)有錯(cuò)誤,但效率會(huì)降低。