结构体
1.结构题定义
结构体是一些值的合集,这些值被称为结构体的成员。结构体的成员可以是任意类型的数据。
2.结构体声明
如何创建一个简单的结构体呢?
结构体的基本构成struct+结构体名+成员类型。
例如:struct+ID+ char name +char sex +int age
``` struct ID
{
char name[10];
char sex[20];
int age;
};
3.结构体成员的定义和初始化
如何给已经创建的结构体添加成员呢?
1.在创建结构体时进行成员的创建
eg:
struct ID
{
char name[10];
char sex[20];
int age;
}zhangsan;
//放在大括号后,分号前。
2.单独定义结构体成员
eg:
struct ID lisi;
3.成员的初始化
struct ID lisi = { "lisi","nan",18 };
4.结构体的大小
在定义一个简单的结构体后,它的大小是多少呢?
一个结构体中会有不同的变量例如:int double char等等等等,不同的结构体所含的成员不同,所以他们的大小也不同。
eg:
struct example
{
int a;
double b;
char c;
};
在这个结构体中共有 int double char 等三个类型的数据,那么三个成员大小分别为4,8,1那么此结构体的大小是不是13呢?
我们可以用sizeof求一下此结构体大小
求出此结构体大小为24与13不符,那么结构体的大小是如何计算的呢?
4.2内存对齐
这里要引入一个新的概念——内存对齐
内存对齐是结构体储存的规则,所有类型的变量都按照此规则进行储存。
1.第一个数据在偏移量为0的地址处
2.第二个成员对齐到自己类型对其数的整数倍(vs的默认对齐数为8,类型对齐数与默认对齐数取小值)
3.结构体的总大小为最大对齐数的整数倍
4.如果结构体中嵌套了一个结构体,那么所嵌套的结构体的对齐数就为自己的大小。
eg:
以此结构体为例:
int为4个字节 double为8个字节所以要对齐到第8个内存地址中 char为1个字节因为任何数字都是1的倍数所以他对齐到第16个地址处
但是结构体的大小为最大对齐数的倍数所以此结构体大小为24个字节。
4.3内存对齐的原因
1.c/c++要在硬件平台上运行,某些硬件只能在特定的地址处取的数据
2.在访问为对齐的内存时,cpu需要做两次内存访问,但是对齐之后只需要访问一次,大大提高性能!
4.4默认对齐数的更改
vs提供的默认对齐数为8。
但我们可以使用命令来更改
eg:
#pragma pack(4)//设置默认对齐数为4
#pragma pack()//还原默认对齐数
eg:
#pragma pack(4)//设置默认对齐数为4
struct example
{
int a;
double b;
char c;
};
printf("%d\n", sizeof(struct example));
#pragma pack()//还原默认对齐数
相同的代码上面为24更改最大对齐数后结果为16