问题现象
最近在调试程序的时候,发现会有异常退出情况,错误提示为: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()
本文详细解析了在ARM处理器上遇到的alignmentfault问题,尤其是在使用std::cout输出double类型时出现的问题。通过分析结构体内存对齐不当的原因,提供了一种封装结构以达到内存对齐的解决方案。
2536

被折叠的 条评论
为什么被折叠?



