Union和struct以及占据内存问题

一、struct和Union的区别

Struct所有的成员会被编译器赋予内存空间,因此可以存储多个变量

Union的成员变量共用一个内存空间,只存储最后一个变量数据

先来看代码

union部分:

union u {
    int a;
    int b;
    int c;
};

在main函数里面赋值

    c.a = 1;
    c.b = 2;
    c.c = 3;
    cout << c.a;

 得出的结论为所有的成员变量数据为最后一个赋值的数据,在使用union的时候只建议是需要一个值的时候,union的成员赋值会对其余成员进行重写

Struct部分

struct l {
    char a;
    char b;
    int c;
    double d;
};

对于其对象的数据为独立存储的

内存大小(字节对齐)

Union

内存方面比较有意思,因为union在上面讲到是只存储最后一位,但我们的数据类型会有所不同,因此union的size会取到最大的那一位

union u {
    char a;
    int b;
    double c;
};

在main函数中

cout << sizeof(c);

得出

最大的一位为double类型8字节

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

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

那如果是这么写两者之间区别在于b的类型分别为int和char

cout<<sizeof(u2)<<endl; // 16
cout<<sizeof(u3)<<endl; // 13

结果如此,在正常计算看来应该是char a[13]最大,但结果不同

其核心的问题是在于int类型为4字节因此需要内存对齐要以4为基准,而char为1字节

Struct的内存

struct的部分比较复杂,上面有说过在看内存大小的时候要记住内存对齐的问题,具体计算并不是先全加起来之后再算的,而是根据顺序遇到的最小能对齐数确定对齐

例子:

struct k {
    char a;
    double b;
    char c;
    int d;
};
struct k2 {
    char a;
    char b;
    int c;
    double d;
};

int main() 
{
    k a;
    k2 b;

    cout << " A:" << sizeof(a) << "B:" << sizeof(b);
}

k为24,k2为16,两者大小不同的问题就在于顺序不同,k1先搜索,遇到的最大为double类,那就以8位对齐,开始计算a为0位,接下来到1位,如果要加入b的话会超过7,因此跳到8开始计算,地址到15,存下c到16,还能继续存下d,结果就到了20,为了数据对齐大小到23,结构大小就为23(从0开始要记住)

k2为16,a从0到1,b从1到2,遇到了c为int型,就以4位为对齐,因为c加入会超过,因此对齐从4开始到7,存入d为8位但还能以4字节对齐,因此到15,k2大小为16

struct的内存大小跟类型和顺序有关

 

总结

先说union和struct,两者来说前者只存下最后的值,大小根据字节对齐以及最大的数据类型决定,后者strcut会给所有变量提供空间,内存所占的大小也会根据存下的类型的顺序有关,这点比较重要。

贴上数据类型的大小,其中32或64位数只有指针和long不相同(数据来自这里)

注意:
1.Linux下long是8字节,Windows下是4字节。
2.string的大小:32位和64位下string差4byte,其实就是一个指针的差别。string内部并不保存字符串本身,而是保存了一个指向字符串开头的指针。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值