c語言結(jié)構(gòu)體對齊規(guī)則 結(jié)構(gòu)體字節(jié)對齊原則?
結(jié)構(gòu)體字節(jié)對齊原則?對齊與內(nèi)存中數(shù)據(jù)的位置有關(guān)。如果變量的內(nèi)存地址是其長度的整數(shù)倍,則稱為自然對齊。例如,在32位CPU中,如果整數(shù)變量的地址是0x00000004,則它自然對齊。字節(jié)對齊的根本原因是
結(jié)構(gòu)體字節(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)對對齊非常嚴(yán)格,如SPARC系統(tǒng)。如果獲取未對齊的數(shù)據(jù),則會發(fā)生錯(cuò)誤。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在運(yùn)行時(shí)會報(bào)告為段錯(cuò)誤,而X86上不會有錯(cuò)誤,但效率會降低。
內(nèi)存對齊的規(guī)則?
為了加快計(jì)算機(jī)的訪問速度,編譯器在默認(rèn)情況下對內(nèi)存進(jìn)行字節(jié)對齊。結(jié)構(gòu)(包括類)字節(jié)對齊的原則如下:
1)結(jié)構(gòu)變量的第一個(gè)地址可以除以其最寬的基本類型成員的大??;
2)結(jié)構(gòu)的每個(gè)成員相對于結(jié)構(gòu)的第一個(gè)地址的偏移量是成員大小的整數(shù)倍。如果需要,編譯器將在成員之間添加內(nèi)部加法;
3)結(jié)構(gòu)的總大小是結(jié)構(gòu)最寬基本類型成員大小的整數(shù)倍。如果需要,編譯器將在最后一個(gè)成員之后添加尾隨填充。Structsbyte1{double//offset 0~7charj//offset 8inta//offset 12~15,因?yàn)?不能被4除,請先填寫9~11}sizeof(sbyte1)//=16structsbyte2{charj//offset 0double//offset 8~15,因?yàn)?不能被8除,請先填寫1~7inta//offset 16~19}sizeof(sbyte2)//=24,為了得到8的倍數(shù),填20~23