什么是保证一个函数指针的大小?
在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位函数指针,“紧凑型”内存模型是相反的。