內存對齊

/****************程序員專用分割線****************/

寫出一個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你聲明的變量總長度要大,這是怎麼回事呢?我之前一直是懵逼的,自從看了這篇博客http://blog.csdn.net/hairetz/article/details/4084088,所以我自己來做個總結,做個筆記。

/****************程序員專用分割線****************/

敲黑板,說重點。首先,先給出三個定理。
上面是你隨便 google一下,人家就可以跟你解釋的,一大堆的道理,我們沒怎麼多時間,討論爲何要對齊.直入主題,怎麼判斷內存對齊規則,sizeof的結果怎麼來的,請牢記以下3條原則:(在沒有#pragma pack宏的情況下,務必看完最後一行)


1:數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset爲0的地方,以後每個數據成員存儲的起始位置要從該成員本身大小或者成員的子成員大小(只要該成員有子成員,比如說是數組,結構體等)的整數倍開始(比如int在32位機爲4字節,則要從4的整數倍地址開始存儲。



2:結構體作爲成員:如果一個結構裏有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲.(struct a裏存有struct b,b裏有char,int ,double等元素,那b應該從8的整數倍開始存儲.)



3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊


看理論太枯燥了,咋們舉個栗子。

#include<iostream>
using namespace std;

struct A
{
    char a;     //0 原則1
    int b;      //4-7 原則1
    char d;     //8原則1
    double c;   //16-23 原則2
};

struct B
{
    struct B
{
    char bb;    //1 原則1
    A aa;       //8-31 原則2
    int cc;     //32-35 原則3 36-39因爲8的整數倍,補齊操作(原則3)
};
};

int main()
{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    return 0;
}

輸出結果
這裏寫圖片描述

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