有关函数指针大小的保证是什么?

Pau*_*gar 30 c pointers function-pointers sizeof type-conversion

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

  • void*的大小与函数指针的大小相同?
  • 由于返回类型,函数指针的大小没有差异?
  • 由于参数类型的不同,函数指针的大小没有差异?

我认为所有这些答案都是肯定的,但我想确定.对于上下文,我正在呼唤sizeof(struct mystruct),仅此而已.

Oli*_*rth 33

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

指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求.同样,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求.所有指向结构类型的指针都应具有相同的表示和对齐要求.所有指向union类型的指针都应具有相同的表示和对齐要求.指向其他类型的指针不需要具有相同的表示或对齐要求.

所以不行; 无法保证a void *可以保存函数指针.

第6.3.2.3节第8段:

指向一种类型的函数的指针可以被转换为指向另一种类型的函数的指针并且再次返回; 结果应该等于原始指针.

暗示一个函数指针类型可以包含任何其他函数指针值.从技术上讲,这与保证函数指针类型的大小不能变化不同,只是它们的值占据相同的范围.


Ste*_*sop 15

不不不.

C不支持具有不同代码和数据指针大小的哈佛架构,因为理想情况下,在为这样的架构编程时,您希望将数据存储在程序存储器(字符串文字等)中,并且要做到这一点,您需要将对象指针转换为代码空间.但它并不禁止它们,因此就标准而言,函数指针可以指代与数据地址空间大小不同的地址空间.

但是,任何函数指针都可以转换为另一个函数指针类型[*]并返回而不会丢弃该值,就像任何对象指针可以转换void*回来一样.因此,根据其签名,函数指针的大小会有所不同,这将是相当令人惊讶的.如果你必须能够以更小的方式在较小的空间中存储相同的值,然后在退回时检索它,那么额外空间没有明显的"使用".

[*]谢谢,schot.

  • 更一般地说:任何函数指针都可以转换为任何其他函数指针类型并返回.(C99 6.3.2.3/8) (3认同)
  • "C并不真正支持哈佛架构"; 我认为这是一个红鲱鱼.有很多这样的架构支持C! (3认同)

Sec*_*ure 9

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

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

虽然C和C++中的函数指针可以实现为简单的地址,但通常情况下 sizeof(Fx)==sizeof(void *),C++中的成员指针通常被实现为"胖指针",通常是简单函数指针大小的两倍或三倍,以便处理虚拟遗产.

函数指针是一种抽象.只要满足标准的要求,任何事情都是可能的.即如果程序中的函数少于256个,则可以使用值为0的单个字节表示NULL,将值1到255作为具有物理地址的表的索引来实现函数指针.如果超过255个函数,则可以扩展为使用2个字节.

  • Downvoter:我写的是错的,因为......? (4认同)
  • 不是我的downvote,但C++成员指针的东西是无关紧要的,因为问题是关于C.最后一段是一个非常好的观点,但是,函数指针肯定*可以*合法地成为某个表的索引,具有额外的级别间接地实际调用它们. (4认同)

小智 7

有一个过去很常见的不同尺寸的实际例子。在 MS-DOS 和早期的 Windows C 编程中,在“中型”内存模型中,您有 16 位数据指针,但有 32 位函数指针,而“紧凑”内存模型则相反。