结构体的知识

本文详细阐述了结构体内存对齐的规则,包括对齐的基本原则、对齐的目的(提升性能和移植性)、以及为何对齐对于不同平台的重要性。介绍了32位系统中对齐的实例和对齐数的计算方式,以及嵌套结构体和最大对齐数的影响。

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

结构体内存对齐的基本规则
1:第一个结构体成员总是从偏移量为0的地址处开始(offsetof(结构体,要访问的结构体成员)宏可以得到偏移量)
2:其他结构体成员,都要对齐到对齐数整数倍的地址处
对齐数=编译器决定的对齐数与结构体成员所占字节的较小值
vs下对齐数为8,比如char 字节为1<8,则下次对齐可在1的整数倍处对齐
linux下没有默认对齐数,对齐数就是成员自身大小
3:结构体的值,是最大对齐数的整数倍
最大对齐数是所有结构体成员中的最大对齐数
4:如果嵌套结构体,那么嵌套的结构体的对齐,按照它内部的最大对齐数对齐,此时,结构体的大小为最大对齐数(含嵌套结构体的最大对齐数)的整数倍

为什么会有内存对齐呢?
1:性能:数据结构(特别是栈)尽可能靠近自然边界对齐
不对齐数据会被访问多次,对齐数据会被访问一次
32位的机器一次性访问4个字节,比如你要访问char和int成员类型,如果不对齐数据char和int都会被访问到
如果对齐数据,char类型的数据就会被跳过,访问int;
2:移植:某些硬件平台可能无法访问某块地址

### C语言结构体相关知识点 #### 1. 基础概念 C语言中的结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起形成一个新的数据单元。例如,可以通过以下方式定义一个简单的结构体[^1]: ```c struct { int b; char c; float d; } a; ``` 这种匿名结构体可以直接声明变量`a`而无需命名。 #### 2. 结构体指针 可以创建指向结构体的指针来操作其成员。例如,在引用中提到的一个例子展示了如何定义并初始化一个匿名结构体及其指针: ```c struct { int b; char c; float d; }*p; ``` 通过这种方式,可以用指针访问结构体成员,提高程序效率和灵活性。 #### 3. 结构体嵌套 当一个结构体内部包含另一个结构体作为其成员时,则称为结构体嵌套。在输出或访问这些嵌套成员时需注意语法上的区别,通常需要连续使用`.`运算符定位目标字段[^2]。下面是一个典型的嵌套结构体实例: ```c #include <stdio.h> struct grade { float chinese; float math; }; struct stu { char name[50]; int age; struct grade a; }; int main() { struct stu stu = {"lixaing", 19, {99.9, 66.6}}; printf("%s\n%d\n", stu.name, stu.age); printf("%.1f\n%.1f\n", stu.a.chinese, stu.a.math); return 0; } ``` 此代码片段清晰地演示了如何处理复杂的、具有层次关系的信息集合。 #### 4. 结构体数组 类似于基本类型的数组,也可以定义由多个相同结构组成的数组以便批量管理相似对象的数据集[^3]。如下所示为一简单示例说明方法之一: ```c #include <stdio.h> struct student { int score; char *name; }; int main(){ // 定义三个学生的记录空间 struct student stu[3]; // 初始化第一个学生信息... stu[0].score=87; stu[0].name="Tom"; // ...以此类推设置其他两个学生的信息... return 0; } ``` 这里我们看到不仅限于单个实体的操作,还可以扩展到整个群体层面的应用场景之中去实现更广泛的功能需求。 #### 5. 内存对齐原则 为了优化硬件性能以及简化编译器设计等原因考虑到了内存地址分配策略方面的问题即所谓的“字节边界”或者叫作“padding填充”。这直接影响着实际占用大小可能大于理论计算所得结果的现象发生情况下的具体表现形式取决于平台架构等因素影响[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值