关于字节对齐
關(guān)于字節(jié)對(duì)齊
- 前言
- 意義
- 自定義字節(jié)對(duì)齊
- 存儲(chǔ)空間
- 內(nèi)存讀取效率
- 平臺(tái)適應(yīng)性
- 結(jié)論
前言
計(jì)算機(jī)中的內(nèi)存空間大小是以字節(jié)(byte)為基本單位劃分的,從理論上講似乎對(duì)任何類型的變量的訪問(wèn)可以從任何地址開始,而計(jì)算機(jī)并非逐字節(jié)大小讀寫內(nèi)存,而是以2,4,或8的倍數(shù)的字節(jié)塊來(lái)讀寫內(nèi)存,則特定類型變量的時(shí)候經(jīng)常需要在特定的內(nèi)存地址訪問(wèn),這就需要各種類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,這就是對(duì)齊。
意義
實(shí)際上編程中,字節(jié)對(duì)齊的工作一般由編譯器來(lái)自動(dòng)實(shí)現(xiàn)了,我們可以不用刻意進(jìn)行字節(jié)的對(duì)齊,但是如果對(duì)于系統(tǒng)性能有較高的要求時(shí),字節(jié)對(duì)齊也是一個(gè)需要考慮的優(yōu)化方向。下面基于結(jié)構(gòu)體的字節(jié)對(duì)齊,以存儲(chǔ)空間、內(nèi)存讀取效率、平臺(tái)適應(yīng)性三個(gè)方面進(jìn)行介紹。
自定義字節(jié)對(duì)齊
#pragma pack (n) //編譯器將按照n個(gè)字節(jié)對(duì)齊。 .... #pragma pack() //取消自定義字節(jié)對(duì)齊方式。存儲(chǔ)空間
如下代碼:
typedef struct {char a;short b;int c;int d;}inputInfo;typedef struct {char a;int b;short c;int d; }inputInfo1;以上兩個(gè)結(jié)構(gòu)體占用空間分別為12與16,可以看到雖然都是相同數(shù)據(jù)變量,不同的排列順序會(huì)有不同的影響,這是編譯器自動(dòng)進(jìn)行的字節(jié)填充造成的,因此合理安排變量位置可以節(jié)省不少的內(nèi)存占用空間。
內(nèi)存讀取效率
由上圖可知,在沒有字節(jié)對(duì)齊的情況下,變量b是通過(guò)兩次才被真正讀取到,讀取數(shù)據(jù)總共用了3次,而字節(jié)對(duì)齊后只用了2次,因此可以提高內(nèi)存的讀取效率,只不過(guò)是在犧牲內(nèi)存空間的條件下。
平臺(tái)適應(yīng)性
由于不同平臺(tái)在對(duì)存儲(chǔ)空間的處理上有很大的不同,因此,同樣的結(jié)構(gòu)在不同平臺(tái)的對(duì)齊方式有所不同,若沒有字節(jié)對(duì)齊,輕則只是影響內(nèi)存的執(zhí)行效率,重則會(huì)造成程序出現(xiàn)錯(cuò)誤。因此我們一般可以選擇兩種處理方法:
結(jié)論
總結(jié)
- 上一篇: 检测raid类型和磁盘坏道脚本
- 下一篇: 装饰器函数