[其他] 【每日话题】结构体对齐为什么那么重要?

[复制链接]
1755|18
 楼主| 21小跑堂 发表于 2023-4-19 09:55 | 显示全部楼层 |阅读模式
#每日话题#

C语言结构体对齐问题,是面试必备问题。技术参与招聘技术面试的时候,大都很喜欢问这个技术点。
这不是在面试时要装B,也不是要故意难为一下面试者,而是这个知识点比较基础,但很重要。
网上搜出来的嵌入式或C语言笔试题,很多都有这种题目,连《程序员面试宝典》也有讲解这种题目。
83610643f481dcf6f7.png

结构体对齐知识点考察,俨然成为编程技术岗面试笔试的一种标配。(cr:嵌入式软件实战派-站派大师兄)
你以前找工作被问到过这种题吗?为什么结构体对齐那么重要?结构对其的本质是什么呢?



话题奖励如下:
1、所有参与回帖的用户,都可获得10家园币(家园币可以兑换礼品);
2、抽一位发表独到见解的用户奖励500家园币。

wzx1994 发表于 2023-4-19 10:25 | 显示全部楼层
结构体对齐是指在编程时,将结构体的大小、对齐方式和访问权限等属性都保持一致,以确保程序的正确性和可读性。
结构体对齐的本质是为了确保程序的正确性和可读性。在嵌入式系统和C语言中,结构体对齐是一个基本的编程概念,它是良好的编码风格和程序结构的必要条件。如果结构体没有对齐,程序可能会出现语法错误、逻辑错误或者不可读的问题。
在嵌入式系统和C语言中,结构体对齐非常重要,因为嵌入式系统的内存分配和内存管理比较困难,因此对内存对齐的要求更加严格。此外,C语言中的指针操作需要对齐,否则可能会导致不可预测的行为或错误。
所以对于程序员来说,熟悉结构体对齐是必须的,这不仅可以提高程序的质量,还可以提高程序员的编程风格和逻辑思维能力。同时,这也是在技术面试和面试中必须掌握的基本技能之一。
最近的项目中也是因为数据不对齐的问题导致各种奇奇怪怪的问题。
yuyy1989 发表于 2023-4-19 15:51 | 显示全部楼层
最近遇到过结构体对齐的问题,在保存一个结构体到flash后发现占用的空间和想象的不一样,百度了一下才发现有结构体对齐这个事,对齐的原因主要两个,一是硬件平台可能只能在某些地址处取得某些特定类型的数据,不对齐的话就没法读到正确的数据,二是对齐后可以优化访问内存的速度。有了结构体对齐后,结构体内成员要合理的排列,不然可能会白白多占用内存。
数码小叶 发表于 2023-4-19 17:46 | 显示全部楼层
硬件平台决定的,纯c语言掉坑很难,但是和硬件挂钩后,百分百会掉坑
王栋春 发表于 2023-4-19 22:13 | 显示全部楼层
感觉C语言做为最为基础和常用的编程语言,结构对齐是有必要的,不然容易出错呀。
EPTmachine 发表于 2023-4-19 23:18 | 显示全部楼层
结构体不对齐,其分配的内存空间的大小就不是确定的,嵌入式中,如果结构体使用的内存大小不确定,就会出现内存溢出的问题,排查问题时,很难确定是哪里出了错。
木野臻 发表于 2023-4-19 23:59 | 显示全部楼层
结构对齐,分配空间划分明确,后续排查问题也井然有序,是一个必不可少的部分。
j543211 发表于 2023-4-20 06:41 | 显示全部楼层
来看看高手们对此语言的看法和心得
blust5 发表于 2023-4-20 08:32 | 显示全部楼层
由于内存分配问题,四字节类型数据都是从能被4整除的地址位置开始的,如果结构体不做对齐的话,会导致四字节类型数据的起始位置不在被4整除的地址位置,从而导致数据读取错误或者无法读取等问题,从而导致程序错误。
因此结构体对齐是有必要的。
可以通过调整结构体内变量顺序,优化结构体占用空间,在匹配结构体对齐规律的同时减少占用内存。
鸡蛋鸭蛋荷包蛋 发表于 2023-4-20 08:42 | 显示全部楼层
由于内存分配问题,四字节类型数据都是从能被4整除的地址位置开始的,如果结构体不做对齐的话,会导致四字节类型数据的起始位置不在被4整除的地址位置,从而导致数据读取错误或者无法读取等问题,从而导致程序错误。
laocuo1142 发表于 2023-4-20 09:30 | 显示全部楼层
清晰整洁吧,好习惯好结果!
laocuo1142 发表于 2023-4-20 09:30 | 显示全部楼层
清晰整洁吧,好习惯好结果!
森贝尔 发表于 2023-4-20 10:10 | 显示全部楼层
内存分配对齐,能更好的分配内存,调用以来不容易出错,用过都说好
ROSHEN_007 发表于 2023-4-20 13:43 | 显示全部楼层
结构体对齐,能节省不少内存空间,编译器分配结构体内每个内部变量是按照内存对齐整数倍分配的,不规则排序会增加结构体的大小,比如按四字节对齐,struct x{char  a,intb,short c,}sizeof得出结构体大小是12,如果写成char a ,short c,int b,sizeof得出是8,减少了4个空间,也可使用编译指令强制内存对齐;不优化的话在大量动态申请内存的时候,可能会导致内存溢出、堆指针异常等情况发生
zlf1208 发表于 2023-4-20 16:41 | 显示全部楼层
本帖最后由 zlf1208 于 2023-4-20 16:49 编辑

结构体对齐是32位字长的硬件寻址方式决定的,不是C语言本身的特性,在8位机上,不对齐是不会出错的。试题的目的是让软件工程师知道:软件是运行在硬件之上的,软件和硬件之间是需要协同工作的,写软件的人也需要了解硬件,不要觉得我是写软件的,硬件跟我无关。很多写软件的人不懂得这一点。
aple0807 发表于 2023-4-20 18:17 | 显示全部楼层
指令集的历史遗留问题,CPU访问不对齐的内存会产生总线错误。现在的M3和M4虽然支持不对齐访问,但需要多周期执行,降低执行速度。
田舍郎 发表于 2023-4-20 21:07 | 显示全部楼层
这题不会,不要,过
地瓜patch 发表于 2023-4-20 22:18 来自手机 | 显示全部楼层
最烦结构体套娃,一层一层又一层
jhcj2014 发表于 2023-4-20 22:50 | 显示全部楼层
我也觉得结构体对齐是一种编程习惯,这种习惯要建立在硬件基础的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:21ic管理
简介:哎呦,这里是二姨家跑跑跑小跑堂,微信联系:xiaopaotang21ic

2285

主题

8273

帖子

290

粉丝
快速回复 在线客服 返回列表 返回顶部