struct、union的內存分配

曾經在一次面試中提到了這個問題,我覺得這裏值得總結一下。

在回答上述問題之前,我們先來回顧一下各自不同的數據類型佔多少之將字節。

這裏寫圖片描述

那麼對於struct只用將所有類型所佔的空間累加,而union不同,它所佔的內存爲其中定義的單個最大的內存。
那麼我們可以很清楚的看出下面測試的答案

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

很明顯答案應該爲7和4.
然而結果並非如此
這裏寫圖片描述

why???

這裏涉及到CPU實現中的內存補齊機制,在CPU中有如下的基本優化規則:對於n字節的元素(n=2、4、8)它的首地址能被n整除,才能獲得最好的性能。

好像有點難以理解哦,爲了保證int的首地址能被四整除,實際上的內存是這樣的
這裏寫圖片描述
因此纔會佔用12個字節的空間。
我們將結構體修改一下

struct 
{
    char c;
    short b;
    int al;

}B;

此時的儲存狀態爲
這裏寫圖片描述

此時佔用的內存爲8字節。

有時候注意下結構體定義的數據的順序,也會提升一點速度,節約一點空間。類也是這樣的。

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