将内存分配给函数(定义或调用)时

时间:2015-03-09 13:58:55

标签: c++ c

将内存分配给某个功能时。 例如:

int doubleMe(int smthng){ 
int dbl = 2*smthng; //line 2
return dbl; 
} 

void main(){ 
int var; 
printf("The double of var is: %d",doubleMe(var)); //line 8
}

何时将内存分配给变量dbl

  • 何时定义(第2行)(编译时)
  • 或调用函数时(第8行)(运行时)

我相信它是在堆栈中调用函数(运行时)时分配的。当函数退出时释放,是吗?如果有人能够更好地解释它会很棒。

This question看起来相似但不完全!

4 个答案:

答案 0 :(得分:9)

编译器在定义函数时生成对象代码。生成的代码包含在堆栈中为函数局部变量分配内存的指令,或者它可以使用寄存器来容纳它们。

在调用函数的情况下,编译器生成函数调用的对象代码以及在堆栈上推送参数的相应指令。此时,编译器可能不知道如何定义函数以及是否定义了函数,因为它的定义可以在其他模块或库中。

考虑到即使您自己不使用函数说明符inline,编译器也可能内联函数。在这种情况下,它会将函数定义放在调用函数的位置。

答案 1 :(得分:2)

关于你的陈述:在编译时将内存分配给变量dbl(或var)
不, 分配内存的指令 是在编译时创建的     在执行该功能之前,不会分配 内存 在函数内创建的内存是 本地范围 内存的示例。如果它是在堆栈上创建的,它将在离开创建它的范围时被释放。如果它是在堆上创建的(即使用[m/c/re]alloc()函数创建的),它将不会发布(或更准确地说,可用,如 { {3}} )直到调用free()或程序退出。

稍后, 您声明:
我相信它是在调用函数时分配的。当函数退出时释放。
此声明为真 ,但这一切都只在运行时发生。不是在编译时。

对于全局范围 内存,执行程序时会创建 堆栈 内存,并且不会释放直到该计划结束。同样,对于 heap 内存,它将在调用free()时或在程序退出时释放。

答案 2 :(得分:2)

  

在堆栈内存

中编译时将内存分配给变量dbl(或var)

不正确,它在运行时分配,就像所有其他堆栈变量一样。这就是使用堆栈的重点。它是在运行时调用函数时分配的。

  

我相信它是在调用函数时分配的。当函数退出时释放,是吗?

答案 3 :(得分:0)

它根本没有在编译期间分配,而是在运行时分配。

在执行期间调用该函数时,将在内存中为其保留任一空间(在大约100%的当前C ++实现中,“在堆栈上”)或者它将驻留在寄存器中。
如果它不在寄存器中,则在函数返回时释放空间。

编译器生成将执行运行时分配的代码(如果有的话)。