历史上的今天
返回首页

历史上的今天

今天是:2025年08月15日(星期五)

正在发生

2019年08月15日 | ARM内存边界对齐以及sizeof问题

2019-08-15 来源:eefocus

默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体


  typedef struct pack{


  char a;


  int b;


  short c;


  }pack;


  对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:


  sizeof(char)=1;


  下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为


  char a;


  char dump(3);


  int b;


  看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果, http://tiyubisai.com/video_news/news_135587.html 最后总的字节数也要能被4个字节整除,所以还需在short c后面再加


  dump(2);


  故总的字节数为12.


  当然以上说的只是简单的情况,下面谈谈arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下


  #prama pack(1)


  后,sizeof(pack)=1 4 2=7


  而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.


  在arm 下要使结构体按指定字节对齐,可行的方法


  1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.


  不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时


  2. typedef struct pack{


  }__attribute__((packed))


  可利用__attribute__属性


  当然最后的方式,还是自己去看arm体系结构与gcc编译选项了。

推荐阅读

史海拾趣

问答坊 | AI 解惑

历年电子大赛原件清单

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 历年电子大赛原件清单  …

查看全部问答>

用过新华龙C8051F020开发板的进

我用的适配器是EC2,接口是USB的,安装了CP120X的驱动,在SILICON lab ide 里选择连接COM3,然后下载程序(一个简单程序,点亮那个P1.6的LED灯),但是一点动静都没有,是什么问题?还有就是我第一次在线调试程序时连接时显示“The serial adapter mus ...…

查看全部问答>

为什么RegDeleteKey()删除不了注册表项了

我用RegCreateKeyEx()生成了一个新的注册表项,但是紧接着调用RegDeleteKey()却删除不了了,我是写的一个小程序试的,不知道是不是不能紧接着删. 另人诧异的是当关掉程序后,再启动,进入程序就可以直接删除了,不知道这是为什么,有碰到这种事儿的吗, ...…

查看全部问答>

protel DXP2004 如何批量修改标识符?

如图 我想把图片上面的 DS107 108 109 尺寸弄小  请问怎么批量把这些标识符修改啊…

查看全部问答>

请教香主,RTC电池供电时间不准

EK-STM32F开发板,JP7跳至VBAT端,电池供电。USB供电时RTC准确的,拔掉USB后板上电池供电工作,24小时之后插上USB,时间慢了大约8小时10分钟,拔掉USB后测电池电压,为3.2V,电量应该可以的,请问这是什么原因?…

查看全部问答>

求助

请高手指点下为什么程序单步运行可以但快速运行不行?…

查看全部问答>

无源干扰设备二线检测维修的测试诊断系统

 基于PXI总线和LabVIEW技术,构建了无源干扰设备测试诊断系统,可完成无源干扰设备各种功能、性能参数快速、准确地测试,并依据测试结果,进行故障诊断,给出维修策略。硬件平台基于高性价比的PXI,测试程序采用LabVIEW开发,故障诊断程序采用 ...…

查看全部问答>

80C51单片机片内RAM低128个存储单元划分为哪4个主要部分?各部分主要功能是什么?

80C51单片机片内RAM低128个存储单元划分为哪4个主要部分?各部分主要功能是什么?…

查看全部问答>

34063 5v升12v

就是这样的电路图,Proteus中可以到12v,为什么实际中只有4.3v?洞洞板上做了两遍了,都是4.3,参数也是那个网页版计算器得来的,小弟不才,请高手指点一二!…

查看全部问答>

DSP28335+AIC23能收发数据,但数据貌似不对,听起来全是噪声,请教是否硬件问题

我现在使用的硬件是研旭的开发板,软件是TI给的Interfacing the TMS320F2833x to the AIC23B Stereo Audio Codec.zip,改一下控制接口和数据接口。 通过控制接口改变采样率,经过示波器测试,控制接口正常;MCBSP的接收和发送中断都能进去,数据接 ...…

查看全部问答>