一、什么是內(nèi)存對(duì)齊

       現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte劃分的,從理論上講似乎對(duì)任何類型的變量的訪問可以從任何地址開始,但實(shí)際情況是在訪問特定變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放,這就是對(duì)齊。

       為什么要了解內(nèi)存對(duì)齊:各個(gè)硬件平臺(tái)對(duì)存儲(chǔ)空間的處理上有很大的不同。一些平臺(tái)對(duì)某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。其他平臺(tái)可能沒有這種情況,但是最常見的是如果不按照適合其平臺(tái)要求對(duì)數(shù)據(jù)存放進(jìn)行對(duì)齊,會(huì)在存取效率上帶來(lái)?yè)p失。比如有些平臺(tái)每次讀都是從偶地址開始,如果一個(gè)int型(假設(shè)為32位系統(tǒng))如果存放在偶地址開始的地方,那么一個(gè)讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會(huì)需要2個(gè)讀周期,并對(duì)兩次讀出的結(jié)果的高低字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。顯然在讀取效率上下降很多。這也是空間和時(shí)間的博弈。

  通常我們不需要去主動(dòng)進(jìn)行內(nèi)存對(duì)齊的操作,編譯器會(huì)自動(dòng)為我們選擇最優(yōu)的對(duì)齊規(guī)則方式,合理利用空間節(jié)省程序運(yùn)行的時(shí)間,但若是我們能了解這種規(guī)則,對(duì)于我們編寫程序還是會(huì)有很大的幫助的。

二、對(duì)齊內(nèi)存規(guī)則

  1.第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。

  2.其他成員變量要對(duì)齊到對(duì)齊數(shù)(編譯器默認(rèn)的一個(gè)對(duì)齊數(shù)與該成員大小的較小值)的整數(shù)倍的地址處。

  3.結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(除了第一個(gè)成員每個(gè)成員變量都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。

  4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。

 

三、實(shí)例解釋

 

要想要看出數(shù)據(jù)的對(duì)齊方式,首先你就得明白各種數(shù)據(jù)類型在各種操作系統(tǒng)下所占字節(jié)的大小。

我們來(lái)看一下在32位系統(tǒng)下各種參數(shù)類型所占字節(jié)的大?。?/p>

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

接著我們用幾個(gè)例子來(lái)講解對(duì)齊規(guī)則:

(1)

首先我們用一字節(jié)對(duì)齊的方式來(lái)檢驗(yàn)我們之前所說的類型所占字節(jié)大小:

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 1 #pragma pack(1)//讓編譯器對(duì)此結(jié)構(gòu)體作字節(jié)對(duì)齊 2 struct A 3 { 4         char a;//  1 5         int b;//   4 6         short c;// 2 7         long d;//  4 8         float e;// 4 9 };10 #pragma pack()//取消字節(jié)對(duì)齊,回復(fù)默認(rèn)字節(jié)對(duì)齊11 int main()12 {13         struct A a;14         printf("%d\n",sizeof(a));15&nbs
        
		

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