為什麼要進行記憶體對齊以及對齊規則

來源:互聯網
上載者:User

標籤:

#include<iostream>using namespace std;struct A{    char a;    int b;    short c;};struct B{    short c;    char a;    int b;};int main(){    cout<<sizeof(A)<<endl;    cout<<sizeof(B)<<endl;    return 0;}

以上結構體變數數量類型相同。但是sizeof卻不同,

    sizeof(A) is 12

    sizeof(B) is  8

那麼問題來了,為什麼兩個一樣的結構體,但是sizeof大小卻不同?

   答案就是記憶體對齊導致結果不同

對於大多數程式員來說,記憶體對齊是透明的,這是編譯器該乾的活,編譯器為程式中的每個資料單元安排在合適的位置上,從而導致了不同的聲明順序的結構體大小不同。

那麼編譯器為什麼要進行記憶體對齊呢?本來sizeof(int +char +short)應該是7,對齊之後反而變大了,為什嗎?

先來看看記憶體對齊的規則?

1.對於結構的各個成員,第一個成員位於位移為0的位置,以後的每個資料成員的位移量必須是  min(#pragma pack()指定的數,這個資料成員的自身長度)的倍數

2.在所有的資料成員完成各自對齊之後,結構或聯合體本身也要進行對齊,對齊將按照 #pragram pack 指定的數值和結構或者聯合體最大資料成員長度中比較小的那個  也就是  min(#pragram pack() , 長度最長的資料成員);

   #pragram pack(n)  表示的是設定n位元組對齊,vc6預設的是8

 

接下來以第一個結構體為例說明上述規則?

A:char佔一個位元組,起始位移為零,int 佔四個位元組,min(8,4)=4;所以應該位移量為4,所以應該在char後面加上三個位元組,不存放任何東西,short 佔兩個位元組,min(8,2)=2;所以位移量是2的倍數,而short位移量是8,是2的倍數,所以無需添加任何位元組,所以第一個規則對齊之後記憶體狀態為  0xxx|0000|00    

  此時一共佔了10個位元組,但是還有結構體本身的對齊, min(8,4)=4;所以總體應該是4的倍數,所以還需要添加兩個位元組在最後面,所以記憶體儲存狀態變為了 0xxx|0000|00xx   一共佔據了12個位元組

 

接下來我們好好討論一下記憶體對齊的作用?

  1.平台原因(移植原因):不是所有的硬體平台都能訪問任意地址上的任意資料,某些硬體平台只能在某些地址處取某些特定類型的資料,否則拋出硬體異常

  2.硬體原因:經過記憶體對齊之後,CPU的記憶體訪問速度大大提升。具體原因接下來解釋

圖一:

我們普通程式員心中的記憶體印象,由一個個位元組組成,但是CPU卻不是這麼看待的

圖二:

cpu把記憶體當成是一塊一塊的,塊的大小可以是2,4,8,16 個位元組,因此CPU在讀取記憶體的時候是一塊一塊進行讀取的,塊的大小稱為(memory granularity)記憶體讀取粒度。

我們再來看看為什麼記憶體不對齊會影響讀取速度?

    假設CPU要讀取一個4位元組大小的資料到寄存器中(假設記憶體讀取粒度是4),分兩種情況討論:

           1.資料從0位元組開始

        2.資料從1位元組開始

解析:當資料從0位元組開始的時候,直接將0-3四個位元組完全讀取到寄存器,結算完成了。

        當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到寄存器,並再次讀取4-7位元組的資料進寄存器,接著把0位元組,4,6,7位元組的資料剔除,最後合并1,2,3,4位元組的資料進寄存器,對一個記憶體未對齊的寄存器進行了這麼多額外操作,大大降低了CPU的效能。

     但是這還屬於樂觀情況,上文提到記憶體對齊的作用之一是平台的移植原因,因為只有部分CPU肯幹,其他部分CPU遇到未對齊邊界就直接罷工了。

參考圖片:

為什麼要進行記憶體對齊以及對齊規則

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.