在筆試時(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é))大?。∟)的塊來(lái)執(zhí)行操作。數(shù)據(jù)對(duì)齊就是將數(shù)據(jù)存儲(chǔ)區(qū)的首地址對(duì)齊字大?。∟)的某個(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ǔ)器字,這有利于提高效率。如下圖
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26