日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

为什么要进行结构体内存对齐

發布時間:2024/3/12 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么要进行结构体内存对齐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

###結構體內存對齊
####什么是結構體內存對齊
結構體不像數組,結構體中可以存放不同類型的數據,它的大小也不是簡單的各個數據成員大小之和,限于讀取內存的要求,而是每個成員在內存中的存儲都要按照一定偏移量來存儲,根據類型的不同,每個成員都要按照一定的對齊數進行對齊存儲,最后整個結構體的大小也要按照一定的對齊數進行對齊。

####對齊規則:

  • 第一個成員在與結構體變量偏移量為0的地址
  • 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
  • 對齊數=編譯器默認的一個對齊數 與 該成員大小的較小值。
  • linux 中默認為4
  • vs 中的默認值為8
  • 結構體總大小為最大對齊數的整數倍(每個成員變量除了第一個成員都有一個對齊數)
  • 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍(含嵌套結構體的對齊數)
    特點
    每個成員的偏移量%自己的對齊數=0;
    結構體整體大小%所有成員最大對齊數=0;
    結構體的對齊數是自己內部成員的對齊數中的最大對齊數
    ####舉例說明

    //平臺VS2013下(默認對齊數為8) //練習一struct S1{char c1;int i;short s2;};printf("%d\n", sizeof(struct S1));//12 //練習二struct S2{char c1;short s2;int i;};printf("%d\n", sizeof(struct S2));//8

    #####案例一分析
    char 類型占1個字節,編譯器默認對齊數為8,則該變量對齊數為1,實際偏移量為0
    int 類型占4個字節,編譯器默認對齊數為8,則該變量對齊數位4,偏移量應該為4的倍數,實際偏移量為4
    short類型占2個字節,編譯器默認對齊數為8,則該變量對齊數2,偏移量應該為2的倍數,實際偏移量為8
    結構體整體的對齊數為所有成員的對齊數中最大的一個,對齊數為4
    結構體整體大小,按照上面數據占據空間大小,計算得結構體大小10字節。
    按照對其規則,應該對齊到4的倍數,實際大小為12字節

    #####案例二分析
    char 類型占1個字節,編譯器默認對齊數為8,則該變量對齊數為1,實際偏移量為0
    short類型占2個字節,編譯器默認對齊數為8,則該變量對齊數2,偏移量應該為2的倍數,實際偏移量為2
    int 類型占4個字節,編譯器默認對齊數為8,則該變量對齊數位4,偏移量應該為4的倍數,實際偏移量為4
    結構體整體的對齊數為所有成員的對齊數中最大的一個,對齊數為4
    結構體整體大小,按照上面數據占據空間大小,計算得結構體大小8字節。
    按照對其規則,應該對齊到4的倍數,實際大小為8字節

    ####圖形分析

    ###為什么存在內存對其
    ####平臺移植型好
    不是所有的硬件平臺都能訪問任意地址上的數據;某些硬件平臺只能只在某些地址訪問某些特定類型的數據,否則拋出硬件異常,及遇到未對齊的邊界直接就不進行讀取數據了。
    ####cpu處理效率高

    從上圖可以看出,對應兩種存儲方式,若CPU的讀取粒度為4字節,

  • 那么對于一個int 類型,若是按照內存對齊來存儲,處理器只需要訪存一次就可以讀取完4個字節
  • 若沒有按照內存對其來讀取,如上圖所示,就需要訪問內存兩次才能讀取出一個完整的int 類型變量
  • 具體過程為,第一次拿出 4個字節,丟棄掉第一個字節,第二次拿出4個字節,丟棄最后的三個字節,然后拼湊出一個完整的 int 類型的數據。
  • ####其實結構體內存對齊是拿空間換取時間的做法。提高效率

    總結

    以上是生活随笔為你收集整理的为什么要进行结构体内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。