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

单片机/C/C++八股:(十五)内存对齐、结构体内存对齐

上一篇下一篇const 关键字的作用和 define 比呢目 录内存对齐、结构体内存对齐1分析讲解2总结内存对齐、结构体内存对齐视频教学连接CPU 到底是怎么读内存的十分钟搞懂内存对齐_哔哩哔哩_bilibili1分析讲解一切的根本原因是CPU 从内存中读取数据32 位系统一次会读取 32 位4字节64 位系统一次会读取 64 位8字节以 32 位系统为例一次读 4 字节就意味着从 0 地址开始的话每次都会从 4 的整数倍地址处开始读。所以为了保证读取效率和兼容性数据存储的时候会自动进行内存对齐实现内存对齐的方式是在变量值之间填充字节padding。数据不进行内存对齐的话就需要读取多次才能拼出完整的值内存对齐规则数据类型的大小就是它的对齐边界数据类型占n nn个字节那么其起始地址就必须存放在n nn的倍数地址上。比如在 32 系统中char 对齐边界1字节任意地址short 对齐边界2字节偶数地址int / float 对齐边界4字节4的倍数地址double 对齐边界8字节8的倍数地址。内存对齐是通用的 硬件/ABI 要求不仅限于结构体主要考察结构体内存对齐还有另一个原因⟶ \longrightarrow⟶结构体的特性结构体的大小必须是占内存最大成员的整数倍。核心原因为了支持结构体数组的正确内存布局确保结构体数组中每一个元素的起始地址都满足其内部成员的对齐要求从而保证程序在所有平台上正确、高效运行。具体来说假设定义了一个结构体S并声明一个数组struct S arr[2];结构体数组元素在内存中是紧挨着的即arr[1] arr[0] sizeof(struct S)为了让arr[1]中的每个成员也依然满足对齐要求sizeof(struct S)必须是一个“安全步长”这个步长必须能保证下一个结构体实例的起始地址仍然满足其内部所有成员的对齐约束。而这个“安全步长”的最小值就是结构体中最大成员的对齐要求也就是结构体的大小必须是占内存最大成员的整数倍。为了达到这个效果编译器会在结构体尾部填充字节。以如下结构体为例structBadStudent{chargrade;// 1字节intid;// 4字节chargender;// 1字节};以为是 1416 字节实际上是 12 字节先内存对齐到 1(3)419 字节 → 再填充字节到 int 型的整数倍 12 字节。缺点及优化方法缺点内存对齐会导致填充字节无法使用造成内存浪费。方法结构体成员按数据类型从大到小排列如果定义了一个 char 型的数组那这个数组不用放在最前面单个元素只是 char 但数组长度可能会造成一定的影响。还以那个结构体为例其元素换个顺序structBadStudent{intid;// 4字节chargrade;// 1字节chargender;// 1字节};现在实际上占用 4116 → 8 字节。2总结内存对齐源于 CPU 根据系统位数按固定字长如 4 或 8 字节高效读取内存的机制要求数据起始地址为其类型大小的整数倍。内存对齐的规则数据类型占n nn个字节那么其起始地址就必须存放在n nn的倍数地址上32/64位系统中数据类型所占字节数不同。而为了确保结构体数组中每一个元素的起始地址都能满足其内部成员的对齐要求所以结构体的大小必须是占内存最大成员的整数倍。虽然内存对齐提高了 CPU 的访问效率但会造成所填字节的浪费所以为了节省空间结构体成员最好要按数据类型从大到小排列。

相关文章:

单片机/C/C++八股:(十五)内存对齐、结构体内存对齐

上一篇下一篇const 关键字的作用(和 define 比呢?)目 录内存对齐、结构体内存对齐1)分析讲解2)总结内存对齐、结构体内存对齐 视频教学连接:CPU 到底是怎么读内存的?十分钟搞懂内存对齐_哔哩哔哩…...

C 语言中的 switch 语句和 while 循环详解

C 语言中的 switch 语句 替代多重 if..else 语句,可以使用 switch 语句。switch 语句用于选择多个代码块中的一个来执行 代码语言:c AI代码解释 switch(表达式) {case x:// 代码块break;case y:// 代码块break;default:// 代码块 工作原理 switch …...

Ubuntu 20.04上构建Zabbix 6.0监控平台:从部署到微信告警的完整实践

1. 环境准备与基础配置 在Ubuntu 20.04上部署Zabbix 6.0监控平台前,需要确保系统环境满足基本要求。我建议使用至少4核CPU、8GB内存的服务器,实测下来这个配置可以稳定监控50台以上的主机。操作系统建议选择Ubuntu 20.04 LTS版本,长期支持周期…...

AI超清画质增强镜像在内容创作中的应用:提升图片质量

AI超清画质增强镜像在内容创作中的应用:提升图片质量 1. 引言:为什么需要AI画质增强 在数字内容创作领域,图片质量直接影响着作品的吸引力和专业度。无论是社交媒体运营、电商产品展示还是个人摄影作品,我们经常会遇到以下困扰&…...

C 语言文件处理全攻略:创建、写入、追加操作解析

C 语言中的文件处理在 C 语言中,您可以通过声明类型为 FILE 的指针,并使用 fopen() 函数来创建、打开、读取和写入文件:代码语言:cAI代码解释FILE *fptr; fptr fopen(filename, mode);FILE 基本上是一个数据类型,我们…...

LoRA训练助手保姆级部署指南:基于Qwen3-32B的Gradio一键镜像

LoRA训练助手保姆级部署指南:基于Qwen3-32B的Gradio一键镜像 专为AI绘图爱好者和模型训练者打造的智能标签生成工具,让LoRA训练数据准备变得简单高效 1. 快速了解LoRA训练助手 如果你正在使用Stable Diffusion或FLUX模型进行AI绘图,肯定遇到…...

ThinkPHP8项目实战:Gitee流水线自动化部署全流程解析

1. 为什么选择Gitee流水线部署ThinkPHP8项目 国内开发者选择Gitee流水线部署ThinkPHP项目有几个天然优势。首先是网络稳定性,代码推送和构建过程都在国内服务器完成,避免了跨国网络波动带来的构建失败问题。其次是响应速度,从代码提交到部署完…...

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度附Matlab代码

作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f52…...

UE5性能调试小技巧:用UMG自制一个可自定义位置的帧率监控悬浮窗

UE5性能调试进阶:打造可拖拽的智能帧率监控悬浮窗 在游戏开发过程中,帧率监控是性能调试的基础需求。虽然UE5引擎内置了帧率显示功能,但仅限于编辑器内使用,且缺乏自定义和交互能力。本文将带你从零构建一个功能完善的帧率监控悬浮…...

Jackson反序列化进阶:深入解析ACCEPT_EMPTY_STRING_AS_NULL_OBJECT与ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT的实战边界

1. 理解ACCEPT_EMPTY_STRING_AS_NULL_OBJECT的本质 第一次看到ACCEPT_EMPTY_STRING_AS_NULL_OBJECT这个配置项时,我下意识以为它会把所有空字符串字段都转为null。直到在真实项目中踩了坑才发现,这个理解完全错误。当时我们系统对接一个第三方服务&#…...

SenseVoice-Small模型高级应用:利用SolidWorks宏命令实现语音控制三维设计

SenseVoice-Small模型高级应用:利用SolidWorks宏命令实现语音控制三维设计 不知道你有没有过这样的经历:在SolidWorks里画图,左手键盘,右手鼠标,眼睛盯着屏幕,脑子里想着尺寸和角度,手忙脚乱。…...

Xshell7与Xftp搭配使用教程:高效管理远程服务器文件

Xshell7与Xftp高效协同:专业开发者的远程服务器管理指南 在当今分布式开发环境中,远程服务器管理已成为开发者日常工作的核心环节。Xshell7作为终端模拟器的标杆产品,与Xftp这对黄金组合,能够为开发者提供从命令行操作到文件传输的…...

OTA升级中途断电/复位/校验失败怎么办?C语言双区备份+状态机回滚机制,99.98%恢复成功率实测

第一章:OTA升级失败的典型场景与危害分析OTA(Over-The-Air)升级是嵌入式设备持续演进的核心能力,但其失败可能引发远超功能异常的系统性风险。理解典型失败场景及其深层危害,是构建高可靠性升级机制的前提。常见失败场…...

Wox启动器核心技术架构解析:从交互体验到智能引擎的创新实践

Wox启动器核心技术架构解析:从交互体验到智能引擎的创新实践 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox Wox作为一款跨平台启动器,通过模块化设计和创新技术实现了&quo…...

解码器缺失惹的祸:QMediaPlayer视频黑屏与卡顿的根源剖析与修复

1. 解码器缺失引发的视频播放异常 最近在调试一个Qt多媒体项目时,遇到了让人头疼的问题:使用QMediaPlayer播放视频时,要么黑屏没画面,要么卡成幻灯片。控制台还不断抛出"DirectShowPlayerService::doRender: Unresolved erro…...

百川2-13B-4bits开源大模型部署教程:RTX 4090 D开箱即用,无需conda环境配置

百川2-13B-4bits开源大模型部署教程:RTX 4090 D开箱即用,无需conda环境配置 1. 开篇:为什么选择百川2-13B-4bits? 如果你正在寻找一个能在消费级显卡上流畅运行、功能强大且完全开源的中文大语言模型,那么百川2-13B-…...

Windows下OpenClaw安装避坑:ollama-QwQ-32B接口配置与权限处理

Windows下OpenClaw安装避坑:ollama-QwQ-32B接口配置与权限处理 1. 为什么选择WindowsOpenClaw组合 去年冬天,当我第一次尝试在Windows上部署OpenClaw时,系统弹出了第7个权限错误提示框。那一刻我突然意识到,Windows环境下的自动…...

无人机避障实战:Vins Fusion在NVIDIA Jetson Orin NX上的性能优化与避坑指南

无人机避障实战:Vins Fusion在NVIDIA Jetson Orin NX上的性能优化与避坑指南 当无人机需要在复杂环境中自主飞行时,实时避障能力成为关键。视觉惯性里程计(VIO)算法如Vins Fusion,通过融合相机和IMU数据,能…...

SakuraAlpha嵌入式物联网通信库详解

1. 项目概述SakuraAlpha 是由 SAKURA Internet 公司面向物联网终端设备开发的轻量级通信模块库,专为基于 ARM Cortex-M 架构的嵌入式平台设计,官方明确支持 mbed OS 5.x/6.x 生态(含 Mbed OS 2 的向后兼容模式)。该库并非通用协议…...

视频编解码技术入门:从YUV到H.265的实战解析

1. 视频编解码技术的基础概念 当你用手机拍摄一段视频时,系统会经历一系列复杂的处理过程。首先摄像头捕捉到的光信号会转换为电信号,再经过模数转换变成数字信号。这个原始的数字视频数据量非常大,比如一段1080p分辨率、30帧/秒的未压缩视频…...

Tao-8k大模型一键部署教程:Python环境配置与快速启动

Tao-8k大模型一键部署教程:Python环境配置与快速启动 最近有不少朋友在问,有没有那种开箱即用、对新手友好的大模型部署方案?特别是现在很多开源模型,虽然能力很强,但部署起来一堆依赖和环境问题,很容易劝…...

Figma-to-JSON:设计资产自动化转换工具,让开发协作效率提升近2/3

Figma-to-JSON:设计资产自动化转换工具,让开发协作效率提升近2/3 【免费下载链接】figma-to-json 项目地址: https://gitcode.com/gh_mirrors/fi/figma-to-json 在数字化产品开发流程中,设计与开发的协作往往面临着"视觉到代码&…...

Pixel Dimension Fissioner显存优化:长文本裂变显存占用<3.2GB实测报告

Pixel Dimension Fissioner显存优化&#xff1a;长文本裂变显存占用<3.2GB实测报告 1. 工具概述 像素语言维度裂变器(Pixel Dimension Fissioner)是一款基于MT5-Zero-Shot-Augment核心引擎构建的文本改写与增强工具。与传统AI工具不同&#xff0c;它采用了独特的16-bit像素…...

云容笔谈应用场景:老年大学开设‘AI+国画’课程中东方红颜生成实践

云容笔谈应用场景&#xff1a;老年大学开设‘AI国画’课程中东方红颜生成实践 1. 课程背景与需求分析 随着数字技术的发展&#xff0c;老年教育正在迎来新的变革机遇。许多老年大学学员对传统文化有着深厚感情&#xff0c;同时又希望学习新技术&#xff0c;体验数字创作的乐趣…...

使用VSCode调试FireRedASR-AED-L项目的完整指南

使用VSCode调试FireRedASR-AED-L项目的完整指南 1. 引言 如果你正在研究语音识别技术&#xff0c;特别是中文普通话和方言的自动语音识别&#xff0c;那么FireRedASR-AED-L项目绝对值得关注。这是一个工业级的开源语音识别模型&#xff0c;在多个公开基准测试中都表现出色。 …...

机器学习入门:为什么正规方程比梯度下降更快?优缺点全解析

机器学习入门&#xff1a;为什么正规方程比梯度下降更快&#xff1f;优缺点全解析 在机器学习的入门阶段&#xff0c;线性回归往往是第一个接触的算法。而在这个简单的模型中&#xff0c;却隐藏着两个截然不同的优化方法&#xff1a;正规方程和梯度下降。许多初学者会困惑&…...

Qwen3-32B-Chat百度热搜标题:国产大模型Qwen3-32B私有部署最佳实践

Qwen3-32B-Chat私有部署最佳实践&#xff1a;RTX4090D 24G显存深度优化指南 1. 开箱即用的私有部署方案 Qwen3-32B作为国产大模型的优秀代表&#xff0c;其强大的语言理解和生成能力备受关注。但对于大多数开发者而言&#xff0c;如何高效部署这个参数量庞大的模型仍是一个挑…...

Oracle推出Java验证组合产品 简化开发者工具管理

Oracle宣布推出Java验证组合产品&#xff08;JVP&#xff09;&#xff0c;为开发者提供由Oracle支持的精选工具、库、框架和服务集合。JVP发布时包含的资产包括基于Java的UI框架JavaFX、Microsoft Visual Studio Code编辑器的Java平台扩展&#xff0c;以及用于微服务的Helidon …...

Sashiko:AI代码审查系统助力Linux内核发现人类遗漏的漏洞

AI正以代码审查系统的形式进入Linux内核领域&#xff0c;而非代码提交。Google的Linux内核工程师Roman Gushchin在LinkedIn上宣布了Sashiko&#xff0c;这是一个用Rust编写的工具&#xff0c;专门用于发现漏洞和筛查代码。Gushchin表示&#xff1a;"根据我的测量&#xff…...

Quartus II时序仿真全攻略:从功能验证到实际延迟分析的技巧解析

Quartus II时序仿真全攻略&#xff1a;从功能验证到实际延迟分析的技巧解析 在数字电路设计领域&#xff0c;仿真验证是确保设计正确性的关键环节。许多初学者在使用Quartus II进行FPGA开发时&#xff0c;往往只关注功能仿真而忽略了时序仿真的重要性&#xff0c;导致实际硬件运…...