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

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

相关文章
|
6月前
|
C语言
关于C语言中函数的知识总结(一)---函数的功能和分类
关于C语言中函数的知识总结(一)---函数的功能和分类
|
8月前
|
存储 编译器 C语言
[Eigen中文文档] 对未对齐数组断言的解释
本文将解释程序因断言失败而终止的问题。
74 0
|
11天前
|
存储 Linux C语言
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-2
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
11天前
|
自然语言处理 Linux 编译器
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-1
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
【C++11特性篇】右值引用变量的属性会被编译器识别成左值【详解&证明&代码演示】
【C++11特性篇】右值引用变量的属性会被编译器识别成左值【详解&证明&代码演示】
|
10月前
|
程序员 编译器 C语言
C语言指针理解 --- 代码配合图形讲解内存四区
C语言指针理解 --- 代码配合图形讲解内存四区
50 0
|
7月前
|
存储 自然语言处理 算法
通过实际的例子,介绍编译器的工作过程
通过实际的例子,介绍编译器的工作过程
44 0
|
9月前
|
C语言
C语言函数和指针的关系之二(未完)
C语言函数和指针的关系之二(未完)
35 0
|
11月前
|
编译器 程序员 C语言
C语言中的小知识点(程序环境和预处理篇(1))
C语言中的小知识点(程序环境和预处理篇(1))
59 0
|
编译器 C语言 C++
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
137 0
【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )