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

2023-05-16

文档总目录

本文目录

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

英文原文(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 属性添加到所有函数具有相同的效果。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 滑动窗口算法总结

    算法目的 滑动窗口法 xff0c 也叫尺取法 xff08 可能也不一定相等 xff0c 大概就是这样 61 61 xff09 xff0c 可以用来解决一些查找满足一定条件的连续区间的性质 xff08 长度等 xff09 的问题 由于区间连续
  • linux软链接的创建、删除和更新

    大家都知道 xff0c 有的时候 xff0c 我们为了省下空间 xff0c 都会使用链接的方式来进行引用操作 同样的 xff0c 在系统级别也有 在Windows系列中 xff0c 我们称其为快捷方式 xff0c 在Linux中我们称其为链
  • 进程、线程、多进程、多线程的优缺点和区别

    进程 xff1a 是并发执行的程序在执行过程中分配和管理资源的基本单位 xff0c 是一个动态概念 xff0c 竞争计算机系统资源的基本单位 线程 xff1a 是进程的一个执行单元 xff0c 是进程内科调度实体 比进程更小的独立运行的基本
  • Postman 汉化(Postman中文版)

    1 首先从官网下载postMan安装包 postman官网下载地址 Download Postman Get Started for Free 2 下载postMan 汉化包 app zip postman汉化包 Releases hlmd
  • UDP的客户端和服务器端的实例(VC6.0实现)

    服务器端程序 xff1a UdpServer cpp Defines the entry point for the console application include 34 stdafx h 34 include lt stdio h
  • STM32中关于串口中断的调试(不断进入发送中断的原因)

    说来惭愧 xff0c 前日在调试stm32f10系列的单片机的时候 xff0c 想做一个关于串口发送的状态机 xff0c 每隔100毫秒发送一次命令 没有用DMA xff0c 就是想单纯的使用发送中断来数据 xff0c 结果在调试的时候一直
  • Psoc Creator 入门——空工程的建立

    最近在做psoc 4000芯片的开发 xff0c 现在简单的说说怎么利用psoc creator进行开发 首先 xff0c 安装psoc creator xff0c 我使用的版本是4 0 安装过程省略 xff0c 赛普拉斯官网有下载链接 x
  • mbedtls使用openssl生成的自签名证书进行TLS实验

    目录 1 使用openssl生成自签名证书2 VS2013编译mbedtls3 mbdtls默认对证书的要求4 mbdtls测试例子详解5 运行测试程序 1 使用openssl生成自签名证书 openssl是一个安全套接字层密码库 xff0
  • IIC的通信波形分析

    关于IIC xff0c 不解释它的历史了 xff0c 有兴趣自己去百度看看 xff0c 本文的图片是由周立功的LAB6021逻辑分析仪抓取的 xff0c 通信的波形是抓取的cypress的psoc 4000芯片得到的 最近项目需要用到触摸I
  • linux下的CSV文件操作

    先介绍一下什么是csv文件 xff0c 这是一种简单的文本文件 xff0c 也被称为逗号分隔值文件 主要是用于存储简单的数据 xff0c 下面在weindows下用UE简单生成一下文件 然后用excel打开 这就是一个简单的csv文件 xf
  • GNU makefile入门——刚开坑,没有干货

    一个完整的makefile文件包含5个部分的内容 xff1a 显示规则 xff0c 隐含规则 xff0c 变量和指示符 xff0c 注释 显示规则 xff1a 包括目标 xff1a 依赖规则 命令 隐含规则 xff1a make根据目标文件
  • Renesas CS+ for ca cx入门(一)

    这是一篇关于Renesas的CS 43 for ca xff08 以下简称CA xff09 的入门简介 xff0c 在网上关于这个IDE的使用方法比较少人讲述 xff0c 兴许使用的人比较少吧 另一个类似的IDE是CS 43 for cc
  • 单片机——按键扫描

    按键扫描 xff0c 我想应该是比较简单的单片机应用了 xff0c 但是有时候看起来简单的东西反而不好写 本文拿大部分人觉得简单的按键扫描聊聊我工作至今对于软件结构的理解 嗯 xff0c 对的 xff0c 是结构 xff0c 不是架构 xf
  • keil的错误: Error: Encountered an improper argument 的解决方法

    将附件中的文件下载然后放到keil一下的安装目录中即可C Keil v5 UV4 xff0c 选择替换即可 文件链接 xff1a http download csdn net download ma57457 10118005 官方说的是支
  • 嵌入式软件没有层次感的原因

    因为软件是一个人写的 xff01 xff01 xff01
  • 博客网站转移

    我的博客会慢慢的转移到新的网站上 xff0c 新的地址为oopsrtos com xff0c 新博客会对arm 体系结果做更深入的探讨 xff0c 主要是关于实时操作系统内核开发的研究 最近在研究FPU xff0c 从内核层解释在操作系统中
  • keil工程中找不到头文件的可能原因

    今天用keil写一个串口调试程序 xff0c 编译工程时 xff0c 总是找不到type h头文件 xff0c 而该文件又是必须的 于是 xff0c 重新看设置 xff0c 头文件路径已经包含到工程里了 xff0c 头文件也已经添加到工程里
  • 在NAND FLASH上建立YAFFS2文件系统

    在NAND FLASH上建立YAFFS2文件系统 xff08 一 xff09 By on 2006 07 22 经过了半个多月的努力 xff0c 终于搞定nandflash的mtd驱动和上层的yaffs2文件系统 这半个多月来几乎每天都要和
  • 个人学习笔记-矩阵的四则运算

    目录 1 矩阵的四则运算1 1 矩阵的乘法运算1 2矩阵的加法运算1 3矩阵的减法运算 2 接口测试输出结果 1 矩阵的四则运算 1 1 矩阵的乘法运算 span class token comment 矩阵乘法 C语言实现分解步骤 xff
  • 单片机通信接口:UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB

    参考资料 xff1a 这些单片机接口 xff0c 一定要熟悉 xff1a UART I2C SPI TTL RS232 RS422 RS485 CAN USB SD卡 秒懂所有USB接口类型 xff0c USB接口大全 1 UART UAR

随机推荐