C++ 结构体和联合体

结构体和联合体

  • 定义
    • 联合体
    • 结构体
  • 结构体数据对齐问题
    • 结构体内存布局
    • 结构何数据缺省对齐原则
      • 32位CPU
        • 修改默认编译选

定义

联合体

使用union定义的是联合体
利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用".“和”->"来直接访问。
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员;

union Score{
	double sc;
	char level;
} //长度8

结构体


//使用struct定义的是结构体
struct Student{
	char name[6];
	int age;
	Score s;
}
cout << sizeof(Score) << endl; //长度9
cout << sizeof(Student) << endl;//长度18

结构体数据对齐问题

C++ 结构体和联合体_第1张图片

结构体内存布局

C++ 结构体和联合体_第2张图片
C++ 结构体和联合体_第3张图片
C++ 结构体和联合体_第4张图片

注意:内存分配的原则,以最大的元素为基础,长度是最大元素长度的整数倍。

struct S1
{
	char x; //1
	double z; //8
	short y; //2
}//长度为24字节。
struct S2
{
	char x; //1
	short y; //2
	double z //8
} //长度为16

结构何数据缺省对齐原则

32位CPU

char:任何地址
short:偶数地址
int:4的整数倍地址
double:4的整数倍地址

  • 修改默认编译选项
修改默认编译选

Visual C++:
#Pragma pack(n)
g++:
attribute(aligned(n))
attribute(packed)

例如:n改为1则是连续的内存空间。
C++ 结构体和联合体_第5张图片

你可能感兴趣的:(C/C++,c++)