面试题-联合体的大小

联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小。

1
#include <iostream>

using namespace std;

//#pragma pack(2)   pragma pack(x)可以改变编译器的对齐方式 
union u1
{
    double a;
    int    b;
};

union u2
{
    char a[13];
    int  b;
};

union u3
{
    char a[13];
    char b;
};

int main()
{
    cout <<"The size of u1 = "<<sizeof(u1) << endl;
    cout <<"The size of u2 = "<<sizeof(u2) << endl;
    cout <<"The size of u3 = "<<sizeof(u3) << endl;
    //u1 = 8;
    //u2 = 16;
    //u3 = 13;


    return 0;   
} 
不仅仅union,对于别的复合数据类型,如unionstructclass的对齐方式为成员中最大的成员对齐方式。
1.对于u1来说,大小就是最大的double类型成员a
2.对于u2来说,最大的空间是char[13]类型的数组。由于int数据b的存在,u2的对齐方式变成43.对于u3来说,最大的空间是char[13]类型的数组。


例2

#include <iostream>

using namespace std;

#pragma pack(2)   

union u
{
    char a[9];
    int a;
};

int main()
{
    cout <<"The size of u = "<<sizeof(u) << endl;

    return 0;   
} 
对齐是可以更改的,使用#pragma pack(x)可以改变编译器的对其方式。
C++固有类型的对齐取编译器对齐方式与自身大小中较小的一个。
例2中手动更改了对齐方式为2int对齐方式为4,自身对齐为2,去最小者,
所以 sizeof(u)= 10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值