结构体 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))来让结构体不进行内存对齐,编译器将按实际需要的大小来分配内存,不添加填充字节。