在C语言中,我需要知道一个结构体的大小,其中包含函数指针。我可以确定在所有平台和架构上:
- void*的大小与函数指针相同吗?
- 函数指针的大小不会因其返回类型而有所不同吗?
- 函数指针的大小不会因其参数类型而有所不同吗?
我假设所有这些问题的答案都是肯定的,但我想要确认一下。为了背景信息,我只是调用sizeof(struct mystruct)
,没有其他操作。
在C语言中,我需要知道一个结构体的大小,其中包含函数指针。我可以确定在所有平台和架构上:
我假设所有这些问题的答案都是肯定的,但我想要确认一下。为了背景信息,我只是调用sizeof(struct mystruct)
,没有其他操作。
不,不,不。
C语言并不偏爱哈佛架构的处理器,这种处理器使用大小不同的代码和数据指针,因为理想情况下,当你为这样的架构编程时,想要将数据存储在程序内存中(如字符串文字等),而要做到这一点,你需要将对象指针指向代码区。但它并没有禁止使用这种处理器,因此就标准而言,函数指针可以引用与数据地址空间大小不同的地址空间。
然而,任何函数指针都可以转换为另一个函数指针类型[*],并且再转换回去时不会损坏值,就像任何对象指针都可以转换为 void *
,再转换回去一样。因此,如果函数指针的大小根据其签名而异,则会令人惊讶。如果您必须能够以某种方式在更少的空间中存储相同的值,然后在进行转换时检索它,那么额外的空间就没有明显的“用途”。
[*] 感谢schot。
除其他答案之外,维基百科还说:
http://en.wikipedia.org/wiki/Function_pointer
尽管在 C 和 C++ 中,函数指针可以被实现为简单的地址,因此通常情况下sizeof(Fx)==sizeof(void *)
,但是在 C++ 中,成员指针经常被实现为“fat 指针”,通常是一个简单函数指针的两到三倍大小,以处理虚继承问题。有一个实际的例子,它涉及到不同的大小,这在以前是很常见的。在 MS-DOS 和早期的 Windows C 编程中,在“medium”内存模型中,您有16位数据指针和32位函数指针,而“compact”内存模型则相反。