我只是想知道从内存角度看可能影响函数指针大小的各种原因。
我想强调的是,我的问题不是关于如何使用函数指针以及如何进行类型转换。这就是我声明一个像
这样的函数指针Activity
并创建一个变量
int (*fptr)(int, int);
如果我在32/64位机器上运行它,我期望获得的大小是多少?
是否可以通过查看其声明来确定函数指针的大小,就像我可以告诉一个32位机器上的void指针大小为4个字节。
答案 0 :(得分:1)
Rango,看here:
__SIZEOF_POINTER__ // Pre-defined GCC macro
对于MS Visual C / C ++编译器,您可以检查宏_WIN64
,_M_IX86
以及其他指示目标处理器体系结构的内容。完整列表here。
P.S。经过一番思考后,我不得不承认我的声明,即函数指针与void*
的大小相同是错误的(我可以想象架构中数据和代码的内存可以用不同的方式处理)。无论如何,对于问题“是否有可能确定函数指针的大小”并考虑到我在评论中得到的澄清,即OP与gcc一起工作,__SIZEOF_POINTER__
可以作为一个答案。虽然@ 2501在他们的评论中提供的答案要好得多 - sizezeof(fptr)
应该适用于任何编译器
答案 1 :(得分:1)
在任何一个程序中,C中的所有函数指针都具有相同的大小。根据C标准,函数指针的大小不必与void *
相同。因此,您无法将函数指针移植到void *
。但是,Posix实际上确实要求两者具有相同的大小,否则dlopen(2)
将不起作用。
我期望获得的尺寸是多少
这取决于你的期望?指针大小 - 数据或函数 - 取决于编译器(及其选项)。如果您在一个流行的通用平台上进行编程,则可能的指针大小为sizeof(size_t)
。但如果你正在做一些专门的事情,那么唯一安全的答案就是RTFM。
答案 2 :(得分:0)
指针只有一个大小。它指的是什么并不重要。它足够大,可以保存进程虚拟内存中可以访问的位置地址。这通常是当前CPU上的64位(8字节)和旧版本上的32位。