c++ - 函数指针的对齐要求

标签 c++ alignment function-pointers

我们知道指向数据的指针的值应该正确对齐。例如,指向double 的指针的值应该是8 的倍数。所以我想知道指向函数的指针是否有类似的要求。

最佳答案

数据和代码的对齐高度依赖于机器。

在许多处理器上,例如在未对齐的地址处读取 double 会导致错误(硬件异常、陷阱或任何你想调用它的东西)——这要么在软件中处理[慢,通常比对齐访问慢 10-1000 倍] 或导致应用程序执行操作失败(类似于访问现代操作系统中的无效内存位置)。例如在 x86 上,它会更慢,但通常不会失败,因为至少在某些情况下,处理器必须执行两个较小的读取操作并将它们组合起来,然后才能获得 double.

代码也可以对齐。大多数 RISC 处理器都有固定大小的代码字——4 个字节是一个通用大小,它们应该与该大小对齐。 “thumb”模式下的 ARM 使用 2 字节指令大小,一些指令在后面的另一个字中有额外的数据。

另一方面,x86 具有“单字节”对齐要求,例如 68K 要求代码仅以 2 个字节对齐。因此,在这方面,对齐需求会有所不同。除此之外,还有效率方面的原因需要进行一定的对齐——例如,在 8、16 或 32 字节边界处开始函数/分支通常是有益的,而且我知道一些较旧的 x86 处理器有限制“一个分支预测的数量”给定 N 字节的代码,可能会有”——这意味着如果在一小段代码中有许多不同的分支,有些分支将不得不在没有分支预测的情况下进行,因为该位置的“插槽”已经满了。

因此,出于性能原因,编译器(有时)会填充代码以对齐函数。然而,这并不总是成功——它用“填充”浪费了缓存空间,这实际上取决于代码的使用方式。编译器通常知道这一点,至少如果您使用基于反馈/配置文件的优化(其中代码通过检测运行以计算代码的使用方式,并且优化基于此结果)。

然而,作为一项规则,函数指针可以指向任何“代码”的合法地址,因此基本要求通常是 1、2 或 4 个字节,具体取决于处理器本身的架构。

关于c++ - 函数指针的对齐要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27183604/

相关文章:

c++ - 全局新运算符调用语法

c++ - flatbuffers schema 字段中标记的 'hash' 有什么用?

c++ - 在 Embarcadero Tools API 中的光标位置插入文本

c++ - 使用 qmake 查找编译器供应商/版本

latex - latex 字母: From Address Left aligned

创建用 C 中的链表实现的通用堆栈

html - CSS3/HTML5/Javascript 竖屏调整大小

css - 如何底部对齐高度不等的内联元素?

C++ 通过引用交换值

c++ - 函数指针失去值(value)