打印
[其他]

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

[复制链接]
1126|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#每日话题#

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


结构体对齐知识点考察,俨然成为编程技术岗面试笔试的一种标配。(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语言掉坑很难,但是和硬件挂钩后,百分百会掉坑

使用特权

评论回复
5
王栋春| | 2023-4-19 22:13 | 只看该作者
感觉C语言做为最为基础和常用的编程语言,结构对齐是有必要的,不然容易出错呀。

使用特权

评论回复
6
EPTmachine| | 2023-4-19 23:18 | 只看该作者
结构体不对齐,其分配的内存空间的大小就不是确定的,嵌入式中,如果结构体使用的内存大小不确定,就会出现内存溢出的问题,排查问题时,很难确定是哪里出了错。

使用特权

评论回复
7
木野臻| | 2023-4-19 23:59 | 只看该作者
结构对齐,分配空间划分明确,后续排查问题也井然有序,是一个必不可少的部分。

使用特权

评论回复
8
j543211| | 2023-4-20 06:41 | 只看该作者
来看看高手们对此语言的看法和心得

使用特权

评论回复
9
blust5| | 2023-4-20 08:32 | 只看该作者
由于内存分配问题,四字节类型数据都是从能被4整除的地址位置开始的,如果结构体不做对齐的话,会导致四字节类型数据的起始位置不在被4整除的地址位置,从而导致数据读取错误或者无法读取等问题,从而导致程序错误。
因此结构体对齐是有必要的。
可以通过调整结构体内变量顺序,优化结构体占用空间,在匹配结构体对齐规律的同时减少占用内存。

使用特权

评论回复
10
鸡蛋鸭蛋荷包蛋| | 2023-4-20 08:42 | 只看该作者
由于内存分配问题,四字节类型数据都是从能被4整除的地址位置开始的,如果结构体不做对齐的话,会导致四字节类型数据的起始位置不在被4整除的地址位置,从而导致数据读取错误或者无法读取等问题,从而导致程序错误。

使用特权

评论回复
11
laocuo1142| | 2023-4-20 09:30 | 只看该作者
清晰整洁吧,好习惯好结果!

使用特权

评论回复
12
laocuo1142| | 2023-4-20 09:30 | 只看该作者
清晰整洁吧,好习惯好结果!

使用特权

评论回复
13
森贝尔| | 2023-4-20 10:10 | 只看该作者
内存分配对齐,能更好的分配内存,调用以来不容易出错,用过都说好

使用特权

评论回复
14
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个空间,也可使用编译指令强制内存对齐;不优化的话在大量动态申请内存的时候,可能会导致内存溢出、堆指针异常等情况发生

使用特权

评论回复
15
zlf1208| | 2023-4-20 16:41 | 只看该作者
本帖最后由 zlf1208 于 2023-4-20 16:49 编辑

结构体对齐是32位字长的硬件寻址方式决定的,不是C语言本身的特性,在8位机上,不对齐是不会出错的。试题的目的是让软件工程师知道:软件是运行在硬件之上的,软件和硬件之间是需要协同工作的,写软件的人也需要了解硬件,不要觉得我是写软件的,硬件跟我无关。很多写软件的人不懂得这一点。

使用特权

评论回复
16
aple0807| | 2023-4-20 18:17 | 只看该作者
指令集的历史遗留问题,CPU访问不对齐的内存会产生总线错误。现在的M3和M4虽然支持不对齐访问,但需要多周期执行,降低执行速度。

使用特权

评论回复
17
田舍郎| | 2023-4-20 21:07 | 只看该作者
这题不会,不要,过

使用特权

评论回复
18
地瓜patch| | 2023-4-20 22:18 | 只看该作者
最烦结构体套娃,一层一层又一层

使用特权

评论回复
19
jhcj2014| | 2023-4-20 22:50 | 只看该作者
我也觉得结构体对齐是一种编程习惯,这种习惯要建立在硬件基础的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2196

主题

7901

帖子

263

粉丝