详细学习结构体

本文详细介绍了C语言中结构体的创建、初始化方法,重点讨论了内存对齐的概念,包括对齐规则、对齐的原因以及位段的特性,强调了内存对齐在性能优化中的作用。
摘要由CSDN通过智能技术生成

,介绍结构体类型,结构体变量的创建和初始化,重点介绍结构中存在的内存对齐,可以画图的形式讲解

一、结构体的创建和初始化

1.1结构体创建和初始化

结构体类型是一种构造数据类型。将多种数据类型“整合”在一起,构造出一种新的数据类型,以满足实际要求。比如描述学生:

这就创建了一个结构体,接下来是两种初始化:

int main()
{
// 按照结构体成员的顺序初始化
struct Stu s1 = { " 张三 " , 20 , " " , "20230818001" };
printf ( "name: %s\n" , s.name);
printf ( "age : %d\n" , s.age);
printf ( "sex : %s\n" , s.sex);
printf ( "id : %s\n" , s.id);
// 按照指定的顺序初始化
struct Stu s2 = { .age = 18 , .name = "lisi" , .id = "20230818002" , .sex = "
printf ( "name: %s\n" , s2.name);
printf ( "age : %d\n" , s2.age);
printf ( "sex : %s\n" , s2.sex);
printf ( "id : %s\n" , s2.id);
return 0 ;
}

1.2用typedef为结构体起别名

C语言中提供了关键字typedef为一个已存在的数据类型定义别名。因此,可用typedef为已定义的结构体类型定义别名。使形式上更加简洁。定义分为以下两种:

第一种

 第二种

二、结构体大小

2.1结构体内存对齐

1.首先要了解对齐规则:

在 C 语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float 等)的变量,也可以是一些复合数据类型(如数组、结构体、联合等)的数据单元。结构体对其规则主要有以下几点:
 
- 第一个数据成员放在 offset 为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如 int 在32位机为4字节,则要从4的整数倍地址开始存储)。

- 结构体变量的首地址一定是这个结构体变量中最大的基础(内置)类型的大小的整数倍。

- 结构体变量中每一个成员相对于结构体首地址的偏移一定是该成员的基础数据类型大小(对齐数)的整数倍。

1.VS 默认的对齐数为8,于该具体成员础数据类型大小相比较小为对齐数

2.Linux中 gcc 没有默认对齐数,对齐数就是成员本身的大小,

- 结构体变量的总大小一定是这个结构体变量中最大的基础类型的大小的整数倍。

- 如果允许修改默认对齐大小,则结构体变量的首地址一定是这个结构体变量中 Min(最大的基础(内置)类型的大小, 默认的对齐规则大小)的整数倍。

举例子:

struct s1大小为12,S2大小为8

 2.修改默认对齐数

#pragma 这个预处理指令,可以改变编译器的默认对齐数。

2.2 为什么存在内存对⻬?

⼤部分的参考资料都是这样说的:

1. 平台原因 (移植原因):

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定
类型的数据,否则抛出硬件异常。

2. 性能原因:

数据结构(尤其是栈)应该尽可能地在⾃然边界上对⻬。原因在于,为了访问未对⻬的内存,处理器需要
作两次内存访问;⽽对⻬的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节,则地
址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以
⽤⼀个内存操作来读或者写值了。否则,我们可能需要执⾏两次内存访问,因为对象可能被分放在两
个8字节内存块中。
总体来说:结构体的内存对⻬是拿空间来换取时间的做法。

2.3结构体位段

那么他的大小是多少呢? 

1.位段的内存分配

1. 位段的成员可以是 int unsigned int signed int 或者是 char 等类型
2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

 4.位段中的成员在内存中从右到左的

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值