一、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内部并不保存字符串本身,而是保存了一个指向字符串开头的指针。