当前位置: 首页 > news >正文

C语言深度理解之——结构体内存对齐

前言:

在C语言中,结构体(struct)是一种用户自定义的数据类型,可以包含不同类型的数据成员。在定义结构体时,编译器会根据平台的要求对结构体的内存进行对齐,以提高内存访问的效率。结构体内存对齐可以避免因为数据成员的排列顺序不同而导致的内存浪费和性能问题。

目录

前言:

1. 结构体内存对齐原则

2. 默认对齐数

3. 修改默认对齐数

4. 代码示例


1. 结构体内存对齐原则

在C语言中,结构体内存对齐的原则可以总结如下:

  • 结构体的起始地址必须是最宽基本类型成员的整数倍。
  • 结构体的每个成员相对于结构体的起始地址的偏移量必须是该成员大小的整数倍。
  • 结构体的总大小必须是最宽基本类型成员大小的整数倍。

2. 默认对齐数

在C语言中,默认的对齐数通常是编译器相关的,一般情况下默认对齐数是当前平台最宽基本类型的大小(例如在32位系统上是4字节,在64位系统上是8字节)。

3. 修改默认对齐数

在C语言中,可以使用#pragma pack(n)指令来修改默认的对齐数,其中n表示要设置的对齐数。这个指令告诉编译器按照n字节对齐数据成员,而不是按照默认的对齐数。

4. 代码示例

下面是一个简单的代码示例,演示了结构体内存对齐和修改默认对齐数的情况:

#include <stdio.h>// 默认对齐数
#pragma pack(1)// 定义一个结构体
struct Student {char name[20];int age;float score;
};int main() {printf("Size of struct Student: %lu bytes\\n", sizeof(struct Student));// 恢复默认对齐数#pragma pack()// 修改对齐数为4#pragma pack(4)struct Student s;printf("Size of struct Student with pack(4): %lu bytes\\n", sizeof(struct Student));return 0;
}

在上面的代码中,我们首先定义了一个结构体Student,包含一个字符数组、一个整型和一个浮点数。然后通过sizeof运算符可以获取结构体的大小。在main函数中,我们演示了如何使用#pragma pack指令来修改默认对齐数,以及如何恢复默认对齐数。

通过运行上述代码,您可以看到在修改对齐数为4时,结构体Student的大小会发生变化。这个例子展示了结构体内存对齐和修改默认对齐数的效果。


这篇文章讲解的就是C语言底层的东西,由于缺少图片的原因,这篇文章并不容易理解,有不懂的地方欢迎私信我或者在评论区指出,我将尽我所能进行帮助。

感谢观看,还请各位大佬留下一个小小的赞!!!

http://www.lryc.cn/news/318559.html

相关文章:

  • LeetCode 热题 100 | 回溯(二)
  • 混合内容错误https中加载了http
  • 游戏免费下载平台模板源码
  • 鸿蒙视频播放的实现
  • QT----计算器
  • Linux:kubernetes(k8s)Deployment的操作(13)
  • 20240619-James-快速鸟瞰并发编程, 呕心沥血整理的架构技术(第3篇)
  • C语言——详解字符函数和字符串函数(一)
  • 三款内衣洗衣机的顶级较量:希亦、小吉、由利,谁才是性价比之王?
  • Java枚举多值映射应用
  • css--浮动
  • 基于有限状态机开发健壮的Nodejs/TCP客户端
  • javaEE13(网站第8章两个课后题)
  • 【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)
  • Unity基础学习
  • Java并发编程学习笔记:AQS
  • Github上哪些好用的工具
  • 如何确保面试流程标准化操作,避免人为因素影响**
  • YOLOv7改进 | 更换主干网络之PP-LCNet
  • MySQL基础-----多表查询之子查询
  • nginx应用场景(附配置)
  • tvm android_rpc_test.py执行报错解决
  • 十、项目沟通管理
  • SQL设计时增加说明列
  • 前端提高性能——使用Intersection Observer API对图片视频进行懒加载
  • 杂七杂八111
  • 微信小程序(一)
  • 【DL经典回顾】激活函数大汇总(十二)(GLU ReGLU附代码和详细公式)
  • 【C++】string类初步介绍
  • HCIP --- BGP 综合实验