C语言复习 结构体 和 联合体

结构体 VS 联合体

在这里插入图片描述

#include <iostream>
using namespace std;

struct MyStruct {
    int a;     // 4 bytes
    double b;  // 8 bytes
    char c;    // 1 byte
};

union MyUnion {
    int a;     // 4 bytes
    double b;  // 8 bytes
    char c;    // 1 byte
};

int main() {
    cout << "结构体大小: " << sizeof(MyStruct) << endl;
    cout << "联合体大小: " << sizeof(MyUnion) << endl;
    return 0;
}

在这里插入图片描述

结构的大小还会涉及到内存对齐

在C/C++中,内存对齐是指编译器在为结构体中的每个成员分配内存时,会按照一定的规则对内存地址进行对齐,以提高内存访问效率。内存对齐可以减少CPU访问内存的次数,从而提升性能,但会造成一定的内存浪费。
在这里插入图片描述
在这里插入图片描述

struct MyStruct {
    int a;     // 4 bytes
    double b;  // 8 bytes
    char c;    // 1 byte
};

在这里插入图片描述

在这里插入图片描述
注意一点 :根据整体对齐的规则,结构体的总大小应该是最大对齐单位的整数倍。

struct MyStruct2 {
    char a;     // 1字节
    double b;   // 8字节
    int c;      // 4字节
};

在这里插入图片描述

所以,无论你这个结构体的三个变量的顺序是什么样子,最后的结构体的大小是一样的。


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总之:结构体更适合表示同时存在的多种数据,而联合体则适合在不同时间保存不同数据的场景。

附:
在某些情况下,我们可以通过编译器的指令或属性来改变结构体的内存对齐。例如,在GCC编译器中,可以使用__attribute__((packed))来让结构体不进行内存对齐,编译器将按实际需要的大小来分配内存,不添加填充字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋到亦天凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值