ARM内存边界对齐以及sizeof问题

默认情况下,在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,但是这不是最终结果,最后总的字节数也要能被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编译选项了。

焊盘对高速信号的影响是怎样的
多功能智能插座USB接口通信电路设计
国内电网电压等级划分
微雪电子656-0102211 MSOP10 SSOP10测试座简介
凌力尔特推出单片同步降压型稳压器 LTC3634
ARM内存边界对齐以及sizeof问题
微机消谐测试的原理是怎样的
关于光伏项目开发&amp的性能分析和介绍
飞凌嵌入式FCU2601网关,为工商业储能EMS注入智慧的力量
大模型及ChatGPT核心技术论文
HDMI自动切换器相比普通HDMI切换器的不同特点
!!现货/收购HP8970B/CTS60/CMD55噪声系数
越疆通过高性能智能协作机器人科技成果鉴定
飞创直线电机模组结构图及其六大创新优势
工业机器人控制柜组成_工业机器人控制柜的作用是什么
深入浅出玩转FPGA视频:时序分析基础
无人机电池及充电主要注意的几个事项
BIS将中国芯片制造商中芯国际(SMIC)列入“实体清单”
精密的智能电池简单化充电过程
苹果AirPods 2/Pro耳机新固件更新,具体内容还不确定