C++中union联合体的内存公用和赋值


稍微讨论一下C++中union联合体的内存公用和赋值,C++中union称为联合体或者共用体,我觉得共用体更为贴切

先看一个例子:

union U1 {
    int i1;
    char i2;
};
int main() {
    U1 A;
    A.i1 = 3;
    A.i2 = 'c';
    cout << A.i1 << " " << A.i2 << endl; 输出结果为97 c

之所以会输出这样的结果,是因为在union联合体中,所有变量是公用一块内存的,这块内存的大小取决于联合体中内存最大的那个。在上面的示例中,联合体U1的内存与int类型相同,也就是4个字节,32位。

当我们对i1赋值时,32位内存都会用上,然后再对i2赋值,只有其中8位内存会赋值,也就是对int的前8位进行重写,由于这里设置的int比较小,只有前8位有数字,再看一个例子

union U1 {
    int i1;
    char i2;
};
int main() {
    U1 A;
    A.i1 = 256; 8位的最大值为255,这样i1的二进制为0000 0001 0000 0000 省略前面16位的0
    A.i2 = 'c';
    cout << A.i1 << " " << A.i2 << endl; 输出结果为355 c

这里i1的值之所以是355,是因为i2对前8位进行重写,重写之后i1的二进制为0000 0001 0110 0011 省略前面16位的0,也就是355,这样可以很明显的看到union联合体中所有变量时公用一块内存的。再例如,如果先赋值内存小的,

union U1 {
    int i1;
    char i2;
};
int main() {
    U1 A;
    A.i2 = 'c';
    A.i1 = 354; 
    cout << A.i1 << " " << A.i2 << endl; 输出结果为355 b

i2的由c变为b,也是因为在对i1赋值时,对i2的8位进行重写导致。

另外,可以使用联合体中的数组对内存较大的变量赋值,例如

union U1 {
    int i1;
    char i2[4];
};
int main() {
    U1 A;
    A.i2[0] = 1;
    A.i2[1] = 1;
    A.i2[2] = 1;
    A.i2[3] = 1;
    cout << A.i1 << endl; 输出结果为16843009,也就是0000 0001 0000 0001 0000 0001 0000 0001

同类型联合体之间可以直接赋值,不同类型的联合体不行,就算两个联合体类的变量和顺序都一样也不行

顺便提一下struct和class的内存大小,如果设置#pragma pack(0),则是内存最大变量的倍数,如果设置#pragma pack(1),则是变量内存之和,例如:

struct my{
	int a;
	char b;
};
#pragma pack(0) 则是8
#pragma pack(1) 则是5

#pragma pack()用于内存对齐。

你可能感兴趣的:(C++,c++,数据结构)