You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM Cortex-M4中C++虚表内.word 0的含义与作用问询

关于ARM GCC生成的C++虚表开头两个.word 0的解释

你看到的这两个.word 0是ARM GCC遵循的C++ ABI(应用二进制接口)规定的虚表前置字段,分别对应偏移量(Offset-to-top)和RTTI类型信息指针,具体作用如下:

第一个.word 0:Offset-to-top(对象偏移量)

这个字段记录的是:当通过当前虚表对应的基类子对象指针访问时,该子对象在完整子类对象中的偏移量(相对于完整对象起始地址)。

  • 你的代码里S1是单继承State,子类对象S1的起始地址和基类State子对象的起始地址完全重合,所以偏移量为0。
  • 这个字段主要为多继承场景设计:当子类继承多个带虚函数的基类时,不同基类的虚表需要通过这个偏移量,在调用虚函数时正确调整this指针到完整对象的起始位置。

第二个.word 0:RTTI类型信息指针

这个字段原本应该指向该类的**运行时类型信息(RTTI)**结构,用于支持dynamic_cast、typeid这类需要运行时类型判断的特性。

  • 你的代码没有使用任何RTTI相关功能,ARM GCC默认会关闭RTTI的生成(或优化掉未使用的RTTI),所以这里填0。
  • 如果编译时加上-frtti选项开启RTTI,这个位置会被替换为实际的typeinfo结构地址。

另外你注意到s1的虚表指针是vtable for S1+8,这正好跳过了前两个4字节的字段(ARM是32位架构,每个.word占4字节),直接指向第一个虚函数entry()的地址——虚函数调用只会用到后面的函数指针列表,前置字段是给编译器的运行时机制预留的。

而你手动实现的C版本虚表不需要遵循C++ ABI的这些规范,自然不会有这两个字段。

内容的提问来源于stack exchange,提问作者blinkbetter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:09:50