union
是C语言提供的一个数据结构,可以让多个变量共用同一块内存。
用法
cpp
union MyUnion
{
int num;
char my_char;
double ff;
};
int main()
{
MyUnion u1;
u1.num = 1;
cout << sizeof(u1) << endl;
}
如图,在MyUnion
里声明了多个变量,而size
则为其中最大的,就是double
对应的8
.
一旦为另外一个变量赋值,则赋的值在访问其他变量的时候,会强行解释为对应的变量。
cpp
int main()
{
MyUnion u1;
u1.my_char = 48;
cout << u1.my_char << endl;
cout << u1.num << endl;
cout << u1.ff << endl;
}
但是这里我不太理解,我赋值以后,好像变量的值并不固定。
感觉VS Code没法分析内存的占用,后面得折腾下VS了。
应用
讲一个很有意思的应用,union可以用来判断CPU是大端模式还是小端模式。
在各种体系的计算机中通常采用的字节存储机制主要有两种: Big-Endian和Little-Endian,即大端模式和小端模式。
Big-Endian和Little-Endian的定义如下:
- Little-Endian:就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
- Big-Endian:就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
cpp
void checkCPU()
{
union MyUnion{
int a;
char c;
}test;
test.a = 1;
if (test.c == 1)
cout << "little endian" <<endl;
else cout << "big endian" <<endl;
}
int main()
{
checkCPU();
return 0;
}