c語言結(jié)構(gòu)體對(duì)齊規(guī)則 c語言中變量存儲(chǔ)為什么要內(nèi)存對(duì)齊?
c語言中變量存儲(chǔ)為什么要內(nèi)存對(duì)齊?為了加快計(jì)算機(jī)的數(shù)據(jù)獲取速度,編譯器會(huì)在默認(rèn)情況下對(duì)結(jié)構(gòu)進(jìn)行處理(事實(shí)上,其他地方的數(shù)據(jù)變量也是如此),這樣寬度為2的基本數(shù)據(jù)類型(short等)位于可被2整除的地址
c語言中變量存儲(chǔ)為什么要內(nèi)存對(duì)齊?
為了加快計(jì)算機(jī)的數(shù)據(jù)獲取速度,編譯器會(huì)在默認(rèn)情況下對(duì)結(jié)構(gòu)進(jìn)行處理(事實(shí)上,其他地方的數(shù)據(jù)變量也是如此),這樣寬度為2的基本數(shù)據(jù)類型(short等)位于可被2整除的地址,寬度為4的基數(shù)數(shù)據(jù)類型(int等)位于地址可被4整除,依此類推。這樣,可能需要在兩個(gè)數(shù)字之間添加填充字節(jié),因此整個(gè)結(jié)構(gòu)的sizeof值會(huì)增加。
字節(jié)對(duì)齊的細(xì)節(jié)與編譯器實(shí)現(xiàn)有關(guān),但一般來說,滿足三個(gè)標(biāo)準(zhǔn):1)結(jié)構(gòu)變量的第一個(gè)地址可以除以其最寬基本類型成員的大小;2) 結(jié)構(gòu)的每個(gè)成員相對(duì)于結(jié)構(gòu)的第一個(gè)地址的偏移量是成員大小的整數(shù)倍。如果需要,編譯器將在成員之間添加內(nèi)部加法;
3)結(jié)構(gòu)的總大小是結(jié)構(gòu)最寬基本類型成員大小的整數(shù)倍。如果需要,編譯器將在最后一個(gè)成員之后添加訓(xùn)練填充。
C語言中結(jié)構(gòu)體占用內(nèi)存大小的問題?
不,相同結(jié)構(gòu)占用的內(nèi)存是相同的。stone和sttwo之間的差異是由于內(nèi)存對(duì)齊問題造成的。在獲取內(nèi)存時(shí),根據(jù)主機(jī)系統(tǒng)的位數(shù),它是一個(gè)32位系統(tǒng)。對(duì)于64位系統(tǒng),每次取4個(gè)字節(jié),對(duì)于64位系統(tǒng),每次取8個(gè)字節(jié)。根據(jù)sizeof的結(jié)果,您的系統(tǒng)是32位的,因此每次提取4個(gè)字節(jié),而一個(gè)字節(jié)提取Char type占用1個(gè)字節(jié),int占用4個(gè)字節(jié),因此Char type自動(dòng)占用4個(gè)字節(jié)。否則,如果char占用一個(gè)字符并得到一個(gè)char,然后轉(zhuǎn)到int變量的前三個(gè),就會(huì)出現(xiàn)問題。因此,您將得到上述sizeof的結(jié)果。Sttwo不會(huì)得到結(jié)果,因?yàn)閮蓚€(gè)char類型相鄰,所以兩個(gè)char類型占用4個(gè)字符,得到結(jié)果我們先占用兩個(gè)char,然后是int。