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

简介: 本文将介绍编译器对堆栈对齐做出了错误的假设问题。

文档总目录

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

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

相关文章
|
9月前
|
存储 编译器 C语言
[Eigen中文文档] 对未对齐数组断言的解释
本文将解释程序因断言失败而终止的问题。
79 0
|
20天前
|
开发者 Python
Python中的仅限位置参数:简化函数调用与提升代码清晰度
【4月更文挑战第17天】Python 3.8 引入了仅限位置参数,增强函数调用清晰度和安全性。通过`/`语法,开发者可指定某些参数只能按位置传递,防止顺序错误和不必要的关键字参数。这有助于提高代码可读性,确保参数正确传递,并在复杂函数中提升安全性。在实际应用中,仅限位置参数可用于明确参数位置、保持向后兼容性和增强函数安全性。
|
7月前
|
编译器 C语言
【C语言航路外传】如何隐藏代码及声明和定义的在工程中真正的使用场景
【C语言航路外传】如何隐藏代码及声明和定义的在工程中真正的使用场景
70 1
|
20天前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
36 0
【C++11特性篇】右值引用变量的属性会被编译器识别成左值【详解&证明&代码演示】
【C++11特性篇】右值引用变量的属性会被编译器识别成左值【详解&证明&代码演示】
|
8月前
|
存储 自然语言处理 算法
通过实际的例子,介绍编译器的工作过程
通过实际的例子,介绍编译器的工作过程
46 0
|
9月前
第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递
第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递
|
12月前
|
存储
编译与解释的区别
编译与解释的区别
105 0
|
12月前
|
编译器 程序员 C语言
C语言中的小知识点(程序环境和预处理篇(1))
C语言中的小知识点(程序环境和预处理篇(1))
60 0
|
12月前
|
存储 自然语言处理 编译器
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #

热门文章

最新文章