內存對齊(Memory alignment)

1. 同個結構體佔用內存可變化

     在 C語言之結構體 章節裏,對struct的功能和使用進行了詳細的說明。「內存對齊」章節作爲struct的一個擴充知識。事實也證明,實際開發中,關注結構體內存佈局特性的同事寥寥無幾。甚至某些同事表示從未去留意過聲明的結構體所佔用內存空間大小,他們會感到詫異、驚訝,爲何聲明的是同一個結構體數據類型,但是當成員列表位置排列順序進行了細微的調整(數據類型相同,成員數量保持不變)之後,佔用的內存空間卻不相同。有這些疑惑的同事,我相信你在閱讀完本節內容之後,定會茅塞頓開,解開你內心的疑惑。

     請讓我們以聲明的兩個結構體數據類型 struct a struct b 作爲拉開本節的序幕。當這兩個結構體數據類型出現在你眼前時候,你是否能夠第一時間裏快準狠地說出你腦海中的答案,並能夠確保它是正確無誤的。

struct a
{
    char c;
    int i;
    short s;
};

struct b
{
    int i;
    char c;
    short s;
};

     很顯然,這兩個數據類型裏除了成員列表的排列順序有所不同外,並無任何其他差異。作爲選擇題,毫無疑問它只有3個待選答案:

     [1] 數據類型struct a佔用內存空間大於數據類型struct b
     [2] 數據類型struct a佔用內存空間等於數據類型struct b
     [3] 數據類型struct a佔用內存空間小於數據類型struct b

     無論你的答案是[1],還是[2],又或許是[3],都暫時擱置片刻,因爲此刻我並不着急你給出迴應。與其匆忙中給出答案,我更希望的是答案推導的過程。數據類型struct a和 數據類型struct b之間的內存佔用關係究竟如何?讓我們帶着這個問題繼續往下走。

2. 結構體內存佈局

      WIKI 中強調:

     The C struct directly references a contiguous block of physical memory, usually delimited (sized) by word-length boundaries. The contents of a struct are stored in contiguous memory.

     即結構體(struct)數據類型中各成員列表佔用連續內存空間。現在對上面的數據類型struct a和 數據類型struct b中各成員分別在內存中的位置作一個分析。

     所有的代碼運行結果信息都是基於以下環境:

     操作系統: CentOS Linux release 7.5.1804 (Core)
     CPU型號: Intel® Xeon® CPU E3-1225 v3 @ 3.20GHz
     CPU核數: cpu cores : 4

     既然結構體中各成員所佔用的內存空間是連續的,那麼姑且畫出其
在這裏插入圖片描述
     
在這裏插入圖片描述
     
     

#include <ucontext.h>
#include <stdio.h>
struct  a
{
        char c;
        int i;
        short s;
};

struct  b
{
        int i;
        char c;
        short s;
};
int main()
{
        printf("sizeof(struct a) = %lu\n", sizeof(struct a));
        printf("sizeof(struct b) = %lu\n", sizeof(struct b));
        return 0;
}


     打印結果:
     sizeof(struct a) = 12
     sizeof(struct b) = 8

     
     

3. 何爲「內存對齊」

     
     
     
     

3.1 爲何需要「內存對齊」

4.

     
     
     
     
     
     
     
     









落下帷幕

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章