自定义类型相关解析(struct)

结构体用于定义多个属性值的变量,初始化时需指定所有成员。匿名结构体必须立即定义并使用。内存对齐规则涉及硬件限制和性能优化,例如VS默认对齐数为8,Linux则按成员大小对齐。结构体大小会调整为最大对齐数的整数倍以优化访问速度,但可能导致空间浪费。可以通过调整对齐数或排列成员顺序来平衡空间和时间效率。结构体作为函数参数时,传递地址通常更高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. struct

关键字:当我们想定义一个含有多个属性值的变量时,可以使用结构体变量

结构体声明

结构体初始化

结构体的特殊声明:匿名结构体

注意:在声明匿名结构体时一定要定义好结构体变量,不然会报错,且这个结构体只能使用一次

结构体内存对齐

对齐规则:

  1. 结构体第一个成员在结构体变量偏移量为0的地址处

  1. 其他成员要对齐到这个成员本身的对齐数的整数倍的地址处

对齐数=编译器默认对齐数大小 与 成员本身结构类型大小的较小值

VS默认的对齐数是8

Liunx本身没有对齐数,成员本身大小就是对齐数

c.结构体总大小为成员最大对齐数的整数倍

d.如果结构体中又嵌套了一个结构体,嵌套的结构体大小对齐到其成员最大对齐数的整数倍,结构体大小就是所有成员(含嵌套的结构体大小)最大对齐数的整数倍

例如:

调试代码,在监视框中也能看到成员变量a和c的内存差了4个字节

为什么会存在内存对齐呢?

  1. 平台自身原因:

不是所有的硬件都能够访问任意位置的数据,一些硬件只能在某些特定地址处才能访问到数据,否则会抛出硬件异常

  1. 性能原因:

如struct{

char c;

int a;

}

在32位机器上,cpu一下访问4个字节

故:结构体内存对齐的本质就是 拿空间换时间!

那我们如何在节省时间的同时又不太浪费空间呢?

让占用空间的成员变量尽量在一起

修改对齐数

#pragma pack(1) 修改对齐数为1

计算结构体偏移量

offsetof:

结构体传参

由于函数传参的时候,参数需要压栈,会有时间和空间上的开销

如果一个结构体过大时,传递参数所需要的时间和空间开销就会变大,导致性能下降

故:结构体传参选择传递结构体的地址值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值