c語言struct字節(jié)對齊 結構體成員的字節(jié)對齊?
結構體成員的字節(jié)對齊?如何編程實現(xiàn)struct字節(jié)對齊問題?結構體字節(jié)對齊原則?24(如果按8字節(jié)對齊,則先前的intfloat僅為8字節(jié),雙8字節(jié),char構成8字節(jié)=24)struct PP{in
結構體成員的字節(jié)對齊?
如何編程實現(xiàn)struct字節(jié)對齊問題?
結構體字節(jié)對齊原則?
24(如果按8字節(jié)對齊,則先前的intfloat僅為8字節(jié),雙8字節(jié),char構成8字節(jié)=24)
struct PP{int afload B char D}OO sizeof(OO)12字節(jié),它是按照4字節(jié)對齊的
對齊與內(nèi)存中數(shù)據(jù)的位置有關。如果變量的內(nèi)存地址是其長度的整數(shù)倍,則稱為自然對齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對齊。字節(jié)對齊的根本原因是CPU訪問數(shù)據(jù)的效率。假設上面整數(shù)變量的地址不是自然對齊的,例如0x00000002,那么CPU需要訪問內(nèi)存兩次,如果它接受它的值。第一次從0x00000002-0x00000003取短,第二次從0x00000004-0x00000005取短,然后合并得到所需的數(shù)據(jù)。如果變量的地址為0x00000003,則需要訪問內(nèi)存三次,第一次訪問char,第二次訪問簡稱char,第三次訪問char,然后合并得到整數(shù)數(shù)據(jù)。如果變量處于自然對齊位置,則只能檢索一次數(shù)據(jù)。有些系統(tǒng)對對齊非常嚴格,如SPARC系統(tǒng)。如果獲取未對齊的數(shù)據(jù),則會發(fā)生錯誤。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在運行時會報告為段錯誤,而X86上不會有錯誤,但效率會降低。
如何理解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é)??偣?=24字節(jié)
例如,在16位計算機中,變量按2字節(jié)對齊。例如,雖然成員a是char類型,但是下一個成員B的地址在0x80000000中只有1個字節(jié),但是下一個成員B的地址不能是0x80000001,而必須是0x80000002,根據(jù)字長對齊。上述結構占用的空間為24 28=16字節(jié)