记录一次alignment fault

问题现象

最近在调试程序的时候,发现会有异常退出情况,错误提示为:alignment fault。
通过gdb 调试发现是在std::cout 是对double类型的输出有问题,导致了此次的alignment fault。

问题原因

在我的程序中用到了1字节对齐,结构体内容大体上像下面这种结构,导致了double夸字节访问,
在ARM处理器中对非对齐内存访问不是特别友好。
alignment fault具体介绍参考另一篇博客

#param pack(1)
struct test
{
	char testc;
	double testd;
};
#param pack()

测试时还发现,正常使用没有问题,但是通过流输出是就会出现异常。
正常使用:

struct test mT;
if(mT.testd > 3.44)
{}

解决方法

为了能够通过流进行输出,最后通过封装一层结构,达到内存对齐。
如此封装之后就可以正常使用了,因为double达到了8字节对齐。

#param pack(1)
struct test
{
	char testc;
	double testd;
};
struct testFix
{
	char testFixC[7]
	struct test testStr;
}
#param pack()
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值