[Eigen中文文档] 编译器对堆栈对齐做出了错误的假设

news/2025/3/28 23:39:28/

文档总目录

本文目录

      • 局部解决方案
      • 全局解决方案

英文原文(Compiler making a wrong assumption on stack alignment)

这是 GCC 的错误,已在 GCC 4.5 中修复。如果遇到此问题,请升级到 GCC 4.5

到目前为止,我们只在 Windows 上遇到过 GCC:例如,MinGW 和 TDM-GCC。

默认情况下,在类似如下函数中:

void foo()
{Eigen::Quaternionf q;//...
}

GCC 假定堆栈已经是 16 字节对齐的,因此对象 q 将在 16 字节对齐的位置创建。根据 Eigen 的要求,不需要特别注意显式对齐对象 q

问题是,在某些特定情况下,这种假设在 Windows 上可能是错误的,其中堆栈只保证 4 字节对齐。 实际上,即使 GCC 负责对齐 main 函数中的堆栈并尽最大努力保持其对齐,但当从另一个线程或从使用另一个编译器编译的二进制文件调用函数时,堆栈对齐可能会被破坏。这会导致在未对齐的位置创建对象 q,从而使程序因对未对齐数组断言而崩溃。至此我们找到了以下解决方案。

局部解决方案

局部解决方案是使用此属性标记此类功能:

__attribute__((force_align_arg_pointer)) void foo()
{Eigen::Quaternionf q;//...
}

阅读 GCC 文档 以了解其作用。当然,这只能在 Windows 上的 GCC 上完成,因此为了可移植性,必须将其封装在一个宏中,并在其他平台上设置该宏为空。此解决方案的优点是可以精确地选择哪个函数可能具有损坏的堆栈对齐。当然,不利的一面是必须为每个此类功能完成此操作,因此可能更喜欢以下两种全局解决方案之一。

全局解决方案

一个全局解决方案是在 Windows 上使用 GCC 进行编译时,使用如下选项:

-mincoming-stack-boundary=2

这告诉 GCC 堆栈只需要对齐到 2^2=4 字节,因此 GCC 现在知道它确实必须格外小心,以便在需要时遵守固定大小的可向量化 Eigen 类型的 16 字节对齐。

另一个全局解决方案是使用如下选项:

-mstackrealign

这与将 force_align_arg_pointer 属性添加到所有函数具有相同的效果。

这些全局解决方案易于使用,但请注意它们可能会损耗程序效率,因为它们会导致每个函数都有额外的序言/结尾说明。


http://www.ppmy.cn/news/57338.html

相关文章

【Unity-UGUI控件全面解析】| Text文本组件详解

🎬【Unity-UGUI控件全面解析】| Text文本组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 改变Text文本颜色4.2 文本换行问题4.3 空格自动换行问题4.4 逐字显示效果五、组件相关扩展使用5.1 文本描边组件(Outline)5.2 阴影组件(Shadow)5.3…

Java每日一练(20230503)

1. 外观数列 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) "1"c…

【Linux从入门到精通】vim的基本使用各种操作详解

文章目录 一、vim编辑器简单介绍 二、vim编辑器的四种模式 2、1 正常/普通/命令模式(Normal mode) 2、2 插入模式(Insert mode) 2、3 末行模式(last line mode) 三、命令模式的相关操作实例 3、1 光标的相关操作 3、2 文本操作 四、插入模式下的相关操作 五、末行模式下的相关操…

Node第三方包 【Request】

文章目录 🌟前言🌟Request🌟安装与使用🌟流(stream)操作🌟Form表单🌟application/x-www-form-urlencoded (URL编码的Form)🌟multipart/form-data (Multipart Form 上传) …

内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络

并非为了教学,仅供自己记录,方便下次用。所以内容不会刻意花时间写的很细节详细。 1. 服务器NPS配置 NPS install安装后,配置文件会在其他位置,通过是 /etc/nps/nps.conf目录。 找到进行修改,主要修改的是http_proxy_p…

本地安装kibana kibana设置中文汉化

一、Kibana简介 Kibana是一个开源的基于浏览器的分析和可视化平台,可以用于搜索,查看,删除Elasticsearch索引并与存储在Elasticsearch索引中的数据进行交互。可以执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。…

AWE2023什么值得看?智哪儿带你五大关键词读懂AWE2023

4月27至30日,2023年中国家电及消费电子博览会(AWE 2023)在上海浦东新国际博览中心开展。 作为与德国IFA、美国CES并肩的全球前三国际家电及消费电子展览会,时隔两年AWE终于重启。沉淀两年,它的规模也是历年最大&#x…

Linux FUSE的资料

FUSE即Filesystem in Userspace。 libfuse的代码仓库。 帖子 CS135 FUSE Documentation用户态文件系统5分钟搞懂用户空间文件系统FUSE工作原理Linux Fuse 文件系统性能学习分布式文件存储基石–fuse文件系统开发实践及性能优化Alluxio FUSE 实现原理用户态文件系统 - FUSE自制…