【问题标题】:what is empty function size?什么是空函数大小?
【发布时间】:2022-01-07 06:12:52
【问题描述】:

整数为 4 字节

double 是 8 个字节

空函数的大小是多少?

void test(){} //-> size????
void test1(){ int a, int b, double c } //-> size????
void test2(){ test() }  -> size??????

当我运行程序时,结果是一样的

void test(){} 
void test1() {int a} 

void main()
{
     cout<<sizeof(&test) <<endl;
     cout<<sizeof(&test1) <<endl;
}

请解决我的问题

【问题讨论】:

  • 您可能想发布该程序的输出,而不是只说结果“相同”。
  • 函数名只不过是一个指针。
  • 检查这个问题及其答案:stackoverflow.com/questions/4156585/…
  • "integer is 4 byte double is 8 byte" -- 这些大小在所有平台上都不能保证。你是怎么想出这些尺寸的? (他们是否涉及使用&amp;,就像您尝试获取函数的大小一样?)
  • 你对函数的大小有什么期望。生成指令的数量?请说明。

标签: c++ memory


【解决方案1】:

ISO C++ 没有函数大小的概念。

ISO 标准并未规定编译器如何为各个函数创建机器级指令并将它们合并到整个程序中。每个人platform 都可以按照自己的方式进行操作。因此,ISO 标准试图定义函数的大小是没有意义的。

因此,您不能使用sizeof 运算符来确定函数的大小。

当您编写表达式&amp;test 时,您会得到一个指向函数test 的指针。在 32 位平台上,指针通常是 32 位(即 4 字节),而在 64 位平台上,指针通常是 64 位(即 8 字节)。

这就是表达式的原因

sizeof(&test)

sizeof(&test1)

将根据您的平台评估为 48

根据在您的平台上生成代码的方式,您可能能够找到对函数大小有意义的定义,并以特定于平台的方式找到函数的大小。但是,大多数平台执行编译器优化,例如允许内联函数,因此它们甚至可能不作为单独的实体存在。在这种情况下,可能很难找到一个有意义的函数大小定义。

【讨论】:

    【解决方案2】:

    C++ 中没有函数大小的概念。当您执行sizeof(&amp;test) 时,您只会得到一个函数指针 的大小,它只能依赖于函数类型,并且很可能所有函数指针类型都具有相同的大小。

    如果您想根据其中的指令数或这些指令在内存中占用的字节数来了解函数的大小,则无法直接使用核心 C++ 或其标准库来实现。相反,您可以使用外部工具查看已编译的目标文件,例如参见this question,或者可能使用特定于平台的库或编译器内在函数/扩展。

    【讨论】:

    • 函数指针类型的大小未在标准中指定。实际上,正如您所说,对于特定实现(例如编译器),所有函数指针可能具有相同的大小。但这是因为对编译器开发人员有意义 - 标准中没有要求(这意味着每个实现都可以为该实现做任何有意义的事情)。
    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2021-11-05
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多