结构体总结

1.为什么会有结构体?

c语言中已经有很多内置类型,比如int,char,float,short等。但它们是单一的内置类型,只能描述一种数据。如果想要描述一名学生,他会有姓名,年龄,体重等多种数据,显然一种单一的内置类型是不足以完成描述的。所以,C语言为了解决这个问 题,增加了结构体这种自定义的数据类型,让程序员可以直接创造适合的类型。

2.结构的声明

 struct tag是结构体类型,memeber 是结构体成员,variable是定义结构体变量。

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。

例:

3.结构体变量的定义和初始化

 

 

4.结构成员访问操作符

4.1 结构体成员的直接访问

结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:

使用方法:结构体变量.成员名

4.2 结构体成员的间接访问

有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。如下所示:

使用方法:结构体指针->成员名 

 5.结构体内存对齐

5.1 对齐规则

1. 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对⻬数 = 编译器默认的⼀个对齐数与该成员变量⼤⼩的较⼩值。

注意:VS 中默认的值为 8;Linux中 gcc 没有默认对齐数,对齐数就是成员⾃⾝的⼤⼩。

3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

 

 

6.为什么存在内存对齐?

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

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

 2. 性能原因:

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

总体来说:结构体的内存对齐是拿空间来换取时间的做法。

 在设计结构体的时候,我们既要满足对齐,⼜要节省空间,可以让占⽤空间⼩的成员尽量集中在⼀起。

 

可以看到同样的结构体成员,S1要比S2大四个字节, 所以让占⽤空间小的成员尽量集中在⼀起可以节省空间。

7.修改默认对齐数

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

在修改默认对齐数后,结构体的大小由原来的12个字节变成了6个字节。 

结构体在对齐方式不合适的时候,我们可以⾃⼰更改默认对齐数。

8.结构体传参

结构体传参的时候,传结构体的地址比较好。

原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下 降。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值