c語言struct字節(jié)對齊 結(jié)構(gòu)體成員的字節(jié)對齊?
結(jié)構(gòu)體成員的字節(jié)對齊?如何編程實現(xiàn)struct字節(jié)對齊問題?字節(jié)對齊基本概念與對齊規(guī)則是什么?24(如果按8字節(jié)對齊,則先前的intfloat僅為8字節(jié),雙8字節(jié),char構(gòu)成8字節(jié)=24)struc
結(jié)構(gòu)體成員的字節(jié)對齊?
如何編程實現(xiàn)struct字節(jié)對齊問題?
字節(jié)對齊基本概念與對齊規(guī)則是什么?
24(如果按8字節(jié)對齊,則先前的intfloat僅為8字節(jié),雙8字節(jié),char構(gòu)成8字節(jié)=24)
struct PP{int afload B char D}OO sizeof(OO)12字節(jié),它是按照4字節(jié)對齊的
對齊與內(nèi)存中數(shù)據(jù)的位置有關(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)對對齊非常嚴格,如SPARC系統(tǒng)。如果數(shù)據(jù)沒有對齊,就會出現(xiàn)錯誤
例如:在16位計算機中,變量按2字節(jié)對齊。例如,雖然成員a是char類型,但是下一個成員B的地址在地址0x80000000中只占用1字節(jié),但是下一個成員B的地址不能使用地址0x80000001,而必須使用地址0x80000002,地址按照字長對齊。上述結(jié)構(gòu)占用的空間為24 28=16字節(jié)