小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關于union和struct的內存分配

 quasiceo 2014-01-15

關于union和struct的內存分配  

2009-10-28 10:32:16|  分類: dos系統(tǒng)c語言 |字號 訂閱

今天看到有一段程序里在struct里面用了個Union,然后就突然想到了struct和Union的區(qū)別,
找了些資料后發(fā)現,struct和Union在內存分配的時候有區(qū)別,Union里的數據是公用一塊內存……,所以給其分配的內存總是Union里面所定義的最大類型長度的整數倍。
     而struct里的數據跟Union不一樣,它們不共享一塊內存,他是按照struct里面定義的數據順序來進行分配內存的,但是分配的基本單位(即:每分配一次的量)是struct里面所定義的最長的數據類型的長度
舉個形象的例子:
struct里面定義的數據類型的順序為:
int a;
char b;
double c;
那個系統(tǒng)分配給這個struct的內存空間是多少呢?
應該是16!
為什么呢?因為系統(tǒng)先分配8個字節(jié)用來放int,結果int只需要4個就夠了,然后剩下的4個中的一個可以用來放后面的char,碰到double c時,因為此時的3個字節(jié)不能存下,所以再分配了一個8個字節(jié)來存放double c

試想下如果struct里面定義的數據類型的順序為:
int a;
double b;
char c;
那個系統(tǒng)分給這個struct的內存空間又是多少呢?
應該是24!
知道為什么的吧?系統(tǒng)碰到int分給他8個字節(jié)存放,碰到double時,剩下的4個字節(jié)不足以存放,所以再分配了8個字節(jié),再遇到char c時又分配了8個字節(jié),這樣系統(tǒng)其實是浪費了5個字節(jié)的空間。
所以在結構體里面最好按照類型從小到大的順序來……
#include <iostream>
using namespace std;
struct A1
{
    char s;
    double b;
};
struct A2
{
    char s1;
    double b;
    char s;
};
struct A3
{
    char s1;
    char s3;
    double b;
};
union B1
{
    char a;
    double b;   
};
union B2
{
    char a;
    char a1;
    double b;
};
union B3
{
    char a;
    double b;
    char a1;
};
union B4
{
    int a[5];
    double b;
};
int main()
{
    cout<<sizeof(A1)<<endl;
    cout<<sizeof(A2)<<endl;
    cout<<sizeof(A3)<<endl;
    cout<<sizeof(B1)<<endl;
    cout<<sizeof(B2)<<endl;
    cout<<sizeof(B3)<<endl;
    cout<<sizeof(B4)<<endl;
    return 0;
}
運行結果為:
16
24
16
8
8
8
24

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多