结构体简单了解

结构体

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值