函数指针的大小取决于哪些参数?

时间:2016-07-06 16:42:29

标签: c pointers function-pointers

我只是想知道从内存角度看可能影响函数指针大小的各种原因。

我想强调的是,我的问题不是关于如何使用函数指针以及如何进行类型转换。这就是我声明一个像

这样的函数指针
Activity

并创建一个变量

 int (*fptr)(int, int);

如果我在32/64位机器上运行它,我期望获得的大小是多少?

是否可以通过查看其声明来确定函数指针的大小,就像我可以告诉一个32位机器上的void指针大小为4个字节。

3 个答案:

答案 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位。