在筆試時(shí),經(jīng)常會(huì)遇到結(jié)構(gòu)體大小的問(wèn)題,實(shí)際就是在考內(nèi)存地址對(duì)齊。在實(shí)際開(kāi)發(fā)中,如果一個(gè)結(jié)構(gòu)體會(huì)在內(nèi)存中高頻地分配創(chuàng)建,那么掌握內(nèi)存地址對(duì)齊規(guī)則,通過(guò)簡(jiǎn)單地自定義對(duì)齊方式,或者調(diào)整結(jié)構(gòu)體成員的順序,可以有效地減少內(nèi)存使用。另外,一些不用邊界對(duì)齊、可以在任何地址(包括奇數(shù)地址)引用任何數(shù)據(jù)類型的的機(jī)器,不在本文討論范圍之內(nèi)。

什么是地址對(duì)齊

計(jì)算機(jī)讀取或者寫(xiě)入存儲(chǔ)器地址時(shí),一般以字(因系統(tǒng)而異,32位系統(tǒng)為4個(gè)字節(jié))大小(N)的塊來(lái)執(zhí)行操作。數(shù)據(jù)對(duì)齊就是將數(shù)據(jù)存儲(chǔ)區(qū)的首地址對(duì)齊字大小(N)的某個(gè)整數(shù)倍地址。為了對(duì)齊數(shù)據(jù),有時(shí)需要在物理上相鄰的兩個(gè)數(shù)據(jù)之間保留或者插入一些無(wú)意義的字節(jié)。內(nèi)存對(duì)齊本事編譯器考慮是事情,但在C、C++語(yǔ)言中,可以人為修改對(duì)齊方式。

為什么要地址對(duì)齊

計(jì)算機(jī)會(huì)保證存儲(chǔ)器字的大小,至少要大于等于計(jì)算機(jī)支持的最大原始數(shù)據(jù)類型的大小。

這樣,一個(gè)原始數(shù)據(jù)類型就一定可以存放在一個(gè)存儲(chǔ)器字中,如果保證了數(shù)據(jù)是地址對(duì)齊的,那么訪問(wèn)一個(gè)原始數(shù)據(jù)就可以保證只訪問(wèn)一個(gè)存儲(chǔ)器字,這有利于提高效率。如下圖

Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

網(wǎng)友評(píng)論