【问题标题】:What are the parameters on which size of a function pointer depends? [duplicate]函数指针的大小取决于哪些参数? [复制]
【发布时间】:2016-07-06 16:42:29
【问题描述】:

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

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

 int (*fptr)(int, int);

并为其创建一个变量

fptr fun1;

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

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

【问题讨论】:

  • 也许您应该强调您实际遇到并试图解决的问题?请阅读the XY problem
  • 仅取决于目标 CPU 架构 - 32 位或 64 位(在某些较旧的系统上为 20、16)
  • 你熟悉sizeof或者PTRDIFF_MAX吗?
  • @rango:您可以查看编译器手册 — 或者您可以运行评估 sizeof(void (*)(void)) 或类似内容的代码。主要两种选择。另一个也是机器上的程序员的传闻,但他们的观点往往有点狭隘。

标签: c pointers function-pointers


【解决方案1】:

兰戈,看here

__SIZEOF_POINTER__ // Pre-defined GCC macro

对于 MS Visual C/C++ 编译器,您可以检查宏 _WIN64_M_IX86 和其他指示目标处理器架构的宏。完整列表here

附:经过一番思考,我不得不承认,我关于函数指针与void* 大小相同的说法是错误的(我可以想象数据和代码的内存可能以不同方式寻址的架构)。无论如何,至于问题“是否可以确定函数指针的大小”,并考虑到我在评论中得到的说明,即 OP 与 gcc 一起工作,__SIZEOF_POINTER__ 可以作为答案.尽管@2501 在他们的评论中提供的答案要好得多 - sizezeof(fptr) 应该适用于任何编译器

【讨论】:

  • 这被称为“仅链接”答案,并不受欢迎。而__SIZEOF_POINTER__ 是 GCC 特有的功能;它不是标准 C 的一般特性。
  • @JonathanLeffler 我改成代码行和链接
  • 同意——你改变了它。您没有解释它的作用、用途或局限性。 (而且,JFTR,不是我的反对票——但无论如何。)
  • 这个问题没有提到 GCC。如果 OP 评论了 GCC(还没有看到它,但我认为它在那里),那么 OP 需要更新问题以这样说(标签和内容)。
  • @mvidelgauz 我说我使用了 gcc。我不打算这个问题是特定于 gcc 的。抱歉,如果这对您有这种意思。
【解决方案2】:

在任何一个程序中,C 中的所有函数指针都具有相同的大小。根据 C 标准,函数指针的大小不必与 void * 相同。因此,您不能将函数指针可移植地分配给void *。但是,Posix 实际上确实要求两者具有相同的大小,否则 dlopen(2) 将不起作用。

我希望得到的尺寸是多少

这取决于您的期望?指针大小——数据或函数——取决于编译器(及其选项)。如果您在流行的通用平台上编程,则指针大小可能为sizeof(size_t)。但是,如果您正在做一些专门的事情,唯一安全的答案是 RTFM。

【讨论】:

    【解决方案3】:

    指针只有一种大小。它指向什么并不重要。它足够大,可以保存进程虚拟内存中可以访问的位置的地址。这通常是当前 CPU 上的 64 位(8 字节)和旧 CPU 上的 32 位。

    【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多