1. 程式人生 > >結構體記憶體對齊問題

結構體記憶體對齊問題

問題描述:

結構體記憶體對齊問題值直接的體現就是計算結構體的sizeof佔用的位元組數。

結構體記憶體對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值(以VS2013為例)

原則1:
結構體中每一個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變數首地址為0計算)。

原則2:
在原則1的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則結束;若不是,則補齊為它的整數倍。

原則3:
對於一個結構體中包含另外一個結構體成員,下面例子會講解,例如結構體S1作為結構體S2的一個數據成員,在計算時結構體S1的資料會作為一個整體去對齊。

以如下程式碼為例:

#include <stdio.h>

struct S1 
{
    char ch1;
    int a;
    double d1;
    char ch2;
};

struct S2
{
    char ch3;
    struct S1 s;
    int b;
    char ch4;
    double d2;
};

int main()
{
    printf("%d\n", sizeof(struct S1));
    printf("%d\n", sizeof(struct S2));
    return
0; }

執行結果:
24
48

下面根據上面的3個原則,可以繪製出下面兩個佔位圖,其中1表示佔用記憶體,0表示空閒。

結構體S1的示意圖如下:

這裡寫圖片描述

結構體S2的示意圖如下:

這裡寫圖片描述