安卓下SIGBUS BUS_ADRALN字节对齐问题

游戏在安卓下崩溃,特别的是debug版正常,release版才崩,这个是内存字节对齐问题。

Linux会对 非对齐内存访问 的进程发送SIGBUS的信号,
Windows允许 非地址对齐的内存访问(会损失性能),所以程序在Windows操作系统下,不会出错。

Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

设置对齐方式:

#pragma pack(push)  //保存对齐状态
#pragma pack(4)

struct T{

...

};

 #pragma pack(pop)  //恢复对齐状态

 

补充一个参考解决方式:

最近手机版本老出现崩溃,之前出现过,但很偶然。最近出现机率比较高,就跟查一下。
报了signal SIGBUS BUS Error,最终定位在uint32_t i32 = *((uint32_t*)m_data); 这句语出了问题, 确认m_data内存是正确的,并且在PC机上运行是正常的。

后面查到原因是x86架构CPU是支持内存非对齐访问,而手机的CPU采用的是RISC架构,为了提高访问效率,不支持非对齐访问。
也就是说将内存m_data转成无符号整形unit32_t,内存地址需要是4的整数倍。

将uint32_t i32 = *((uint32_t*)m_data)改为
uint32_t i32 = 0;
char* p = (char*)&i32;
for(int i =0;i < 4;i++)
{
    p[i] = m_data[i];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值