什么是保证一个函数指针的大小?

在C中,我需要知道一个结构的大小,其中有函数指针。 我可以保证在所有平台和架构上:

  • void *的大小与函数指针的大小相同?
  • 函数指针的大小是否因返回types而不同?
  • 函数指针的大小不因参数types而异?

我想所有这些答案都是肯定的,但是我想确定一下。 对于上下文,我打电话给sizeof(struct mystruct) ,仅此而已。

从C99规范,第6.2.5节,第27段:

指向void的指针与指向字符types的指针具有相同的表示和alignment要求。 同样,指向兼容types的合格或不合格版本的指针应具有相同的表示和alignment要求。 所有指向结构types的指针应该具有相同的表示和alignment要求。 所有指向联合types的指针应具有相同的表示和alignment要求。 指向其他types的指针不需要具有相同的表示或alignment要求。

所以不行; 不能保证一个void *可以保存一个函数指针。

第6.3.2.3节第8段:

指向一种types的函数的指针可以被转换为指向另一种types的函数的指针并返回; 结果应该等于原始指针。

这意味着一个函数指针types可以包含任何其他的函数指针值。 从技术上来说,这与保证函数指针types的大小不能相同,仅仅是它们的值占用相同的范围。

不不不。

C不赞成具有不同代码和数据指针大小的哈佛体系结构,因为理想情况下,当编程这样的体系结构时,您希望将数据存储在程序存储器(string文字等)中,并且需要将对象指针代码空间。 但是它并不禁止它们,因此就标准而言,函数指针可以指与数据地址空间大小不同的地址空间。

但是,任何函数指针都可以转换为另一个函数指针types[*],并返回而不丢弃该值,就像任何对象指针可以转换为void*和back一样。 所以函数指针根据其签名的大小会有所不同。 没有明显的“使用”额外的空间,如果你必须能够以相同的价值存储在较小的空间,然后回收时检索它。

谢谢,谢谢。

除了其他的答案,维基百科说:

http://en.wikipedia.org/wiki/Function_pointer

尽pipeC和C ++中的函数指针可以作为简单的地址来实现,所以通常sizeof(Fx)==sizeof(void *) ,C ++中的成员指针通常被实现为“胖指针”,一般是两倍或三倍大小一个简单的函数指针,以处理虚拟inheritance。

函数指针是一个抽象。 只要满足标准的要求,任何事情都是可能的。 也就是说,如果你的程序中有less于256个函数,函数指针可以通过使用一个值为0的单个字节来实现,而值为1到255作为具有物理地址的表的索引。 如果超过255个函数,可以扩展为使用2个字节。

有一个常用的不同大小的实际例子。 在MS-DOS和早期的Windows C编程中,在“中”内存模型中,您有16位数据指针,但有32位函数指针,“紧凑型”内存模型是相反的。