C 函数中的什么占用了内存空间?

C 函数中的什么占用了内存空间?,c,function,memory-management,C,Function,Memory Management,最近我发布了一个问题: 我得到的最佳答案是: 是的,函数占用内存空间,但其大小完全取决于函数 现在我不是问它们占用的确切数量,而是问函数中占用内存空间的是什么 对于exmaple:- void demo() { } 上面的函数编译时没有任何错误,但此函数完全为空,甚至没有return语句。那么,是什么占据了这个函数的内存空间呢?编辑:谢谢你的评论,他的评论确实是正确的!因此,我改变了答案 使用除“无”之外的任何优化设置,如果此函数是静态定义的(即此编译单元的本地),编译器将优化此函数。如果没有

最近我发布了一个问题: 我得到的最佳答案是:

是的,函数占用内存空间,但其大小完全取决于函数

现在我不是问它们占用的确切数量,而是问函数中占用内存空间的是什么

对于exmaple:-

void demo()
{ }
上面的函数编译时没有任何错误,但此函数完全为空,甚至没有return语句。那么,是什么占据了这个函数的内存空间呢?

编辑:谢谢你的评论,他的评论确实是正确的!因此,我改变了答案

使用除“无”之外的任何优化设置,如果此函数是静态定义的(即此编译单元的本地),编译器将优化此函数。如果没有打开优化,它可能不会。在这种情况下,编译器仍可能发出代码,这些代码在进入函数时设置堆栈帧等,在离开函数时销毁堆栈帧等

正如Pascal指出的,当它具有外部链接时,这是不可能的,因为编译器通常不会跨模块访问。但是,在这种情况下,如果链接器检测到函数未被调用,则应该对其进行优化

此外,完全可以确定函数占用的内存量。对于包含函数的对象,可以查看/或类似的适当实用程序:

回答你的问题

如果调用该函数,那么占用内存空间的是什么


函数必须编译成。这是一组驻留在内存中的、与体系结构相关的长度/值等指令。计算机从存储器中提取指令。因此,您的函数必须驻留在内存中的某个位置,CPU才能获取并执行它。你写的C代码被编译成这段机器代码,正是这段代码占用了内存空间

编译器在优化时通常会跳过此函数。因此,答案是不会为调用空函数保留内存。

如果我们忽略编译器可能会或可能不会优化函数,那么函数会占用许多不同类型的内存

每次调用函数时,程序都可能必须在堆栈上存储各种CPU寄存器,例如。此外,一旦函数执行完毕,程序计数器将存储在堆栈上,否则CPU将不知道返回到哪里

保存哪种类型的寄存器,保存在何处,保存方式取决于系统。在程序中遇到执行函数指令时,CPU可能会自动执行很多操作

如果有任何参数或返回值,它们也将存储在堆栈/寄存器中。在这种情况下,它们可能由调用者或函数保存,这是系统特定的,称为


除上述内容外,作为函数体的实际代码当然也存储在某个地方:在程序内存中,通常称为.text。

假设编译器没有省略给定函数,因为它什么也不做。并且假设编译器也不会内联它,因为函数很小。您断言函数不做任何事情,不调用另一个函数,没有局部变量,也没有参数和返回值——那么为什么它需要内存呢

首先,函数占用的大小将位于两个位置。一个在生成的二进制可执行文件中,另一个在调用此函数的线程的调用堆栈中。空函数类似于零字节文件或目录。两者似乎都不占用磁盘中的任何存储空间,因为它显示为“0字节”。但是,它们占用的内存是磁盘

“空文件的类比和空函数并不完全相同,只是为了理解,”我写道。函数将由某个函数调用方调用,因此该函数的返回地址将保留在当前线程的调用堆栈中。当函数不再存在时,将查找该返回地址,ESP将指向该位置以执行下一条指令

调用约定还会为空函数添加更多指令,以清理调用堆栈。例如,Pascal调用约定将有更多的指令在函数退出时清理调用堆栈


32位或64位程序的位精度也会改变所有簿记所需的大小。

绝对不会“使用除无之外的任何优化设置,编译器应该优化此函数”。功能演示具有外部链接。编译器无法删除它。@Jimbo:如果调用了该函数,那么什么会占用内存空间?一个好的编译器应该优化并删除该函数,即使您调用了它。但假设您打印了deom的地址,那么函数定义将 它是可执行的。