基于N2346标准的函数指针差异化表示架构示例问询
N2346/6.2.5p28 条款规定:
所有结构体类型的指针互相之间必须具备相同的表示与对齐要求。所有联合体类型的指针互相之间必须具备相同的表示与对齐要求。指向其他类型的指针无需具备相同的表示或对齐要求。
以下是几种存在不同函数指针表示/对齐差异的实际架构及示例:
1. 大内存模型的AVR 8位单片机(如ATmega2560)
AVR属于典型的哈佛架构,程序存储(ROM)和数据存储(RAM)独立编址:
- 小内存模型下,ROM空间不超过64KB,函数指针为16位,对齐要求2字节,可覆盖全部ROM地址范围
- 大内存模型下,ROM空间扩展到256KB,函数指针升级为24位(实际存储占用4字节),对齐要求4字节,额外多出来的8位用于选择ROM的存储页
两种模型下的函数指针长度、对齐要求、地址解析逻辑完全不同,直接互转必然会出现调用错误。
2. 带Thumb指令集的早期ARM架构(ARMv4及更早版本)
这类ARM架构同时支持32位ARM指令集和16位Thumb指令集,硬件通过函数指针的最低位判断要执行的指令集类型:
- 指向ARM指令的函数指针最低位固定为0,有效地址要求4字节对齐
- 指向Thumb指令的函数指针最低位固定为1,有效地址要求2字节对齐
如果把Thumb函数的指针直接赋值给ARM函数指针类型再调用,处理器会把地址最低位的1当成有效地址位的一部分,访问到错误的指令地址,直接触发未定义指令异常。
3. IBM i(原AS/400)商用平台
该平台的函数指针是128位的胖指针,内置了代码段权限标识、段基地址、入口偏移、调用约定标记等多个字段,而普通数据指针仅为64位。哪怕同是函数指针,不同调用约定的函数对应的指针内部字段定义也有差异,对齐要求统一为8字节,和普通数据指针、不同调用约定的函数指针都不能直接通用。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

