联合体存储空间

/*
  联合体存储方式
  备注:
        1、内存中数据低位字节存入低位地址,高位字节存入高位字节,而数据的地址采用它的低地址
来表示      

         2、联合体存储空间为最大的元素占用空间,此空间公用。
*/
#include <iostream>

using namespace std;

union //联合体空间大小为i的大小,4Bytes 
{
     unsigned char a;
     unsigned int i;
} u;

int main(void)
{
    u.i = 0xf0f1f2f3;     

   cout<<hex<<u.i<<endl;    

   cout<<hex<<int(u.a)<<endl; 

    return 0;
}

输出结果:

f0f1f2f3

f3

### 联合体和结构体共享内存空间的原理 在C/C++中,`struct` 和 `union` 是两种不同的数据聚合方式。尽管它们都用于组合多个成员变量,但在内存布局上存在显著差异。 #### 结构体 (`struct`) 的内存分配 当定义一个结构体时,编译器会为每个成员变量分配独立的存储区域,并按照其声明顺序依次排列这些成员变量。为了提高访问效率,可能会引入填充字节(padding),从而满足特定类型的对齐需求[^1]。 ```c typedef struct { char c; int i; } MyStruct; // 假设系统默认int类型需要4字节对齐,则MyStruct实际占用至少8字节: // 1 byte for 'char', followed by 3 bytes padding, // then 4 bytes for 'int'. ``` #### 联合体 (`union`) 的内存分配 相比之下,联合体会让所有的成员共享同一块内存区域。这意味着,在任何时刻,仅有一个成员能够保存有效值;如果给另一个成员赋新值,先前的数据将会被覆盖掉。因此,联合体内存大小等于其中最大尺寸成员所需的容量加上必要的填充位数之总和[^2]。 ```c typedef union { char c; int i; } MyUnion; // 此处MyUnion占据的空间取决于较大者'int'即4bytes, // 不管当前操作的是字符还是整型。 ``` #### 如何实现两者间交互? 有时我们希望利用这种特性来达到某些特殊目的比如压缩储存或者转换数据形式等情况下可以考虑把二者结合起来使用: ```c++ #include <iostream> using namespace std; union SharedSpace{ struct IndividualFields{ unsigned short fieldA : 5; // bit-field with width specified. unsigned short fieldB : 10; unsigned short fieldC : 1; }fields; uint16_t wholeValue; }; void demonstrateSharedMemory(){ SharedSpace ss; ss.fields.fieldA = 7; ss.fields.fieldB = 511; ss.fields.fieldC = true; cout << "Field A: " << static_cast<int>(ss.fields.fieldA) << endl; cout << "Whole Value as Integer: " << static_cast<int>(ss.wholeValue) << endl; } ``` 上述例子展示了通过定义内部嵌套的方式使得既可以单独访问各个字段也可以整体看待整个数值的情况发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值