当我们在一个函数内部定义一个变量(这里不是主要的)时,是在运行时完成内存分配还是为我们提供加载器?
当我拥有时会发生什么:
int f()
{
int a=10;
........
}
main()
{
int i;
scanf("%d",&i);
while(--i)
f();
..........
}
函数f()中的'a'是'i'次创建的?动态分配也是如此?
答案 0 :(得分:11)
在a
的每次调用期间生成局部变量f()
。它是为f()
设置'堆栈框架'的一部分,并且几乎没有任何成本。它占用了一个小堆栈空间,但不超过int
所需。
在while(--i) f();
期间,函数f()
被调用10次,每次“新”a
占用相同的内存点。我们不调用此动态分配,称为堆栈,本地或自动分配。
答案 1 :(得分:1)
这是一个堆栈分配,意味着该堆栈上保留了整数的位置 - 它没有被分配为“在堆上找到4个空闲字节并为我分配它们”。
答案 2 :(得分:1)
答案 3 :(得分:0)
变量在堆栈上分配,而不是“动态内存”。是的,我会把它放在堆栈上。
答案 4 :(得分:0)
通常,在函数中定义变量时,内存分配在运行时完成,变量存储在堆栈中,表示这些变量的存储系统:局部变量。
是。在您提供的示例中,变量a在此过程之后'i'创建:
While Loop
Function f()
Push variable a into stack
Function f logic
Pull variable a from stack
End Function f()
End While
因此,局部变量的一般行为(函数或块中的变量)将在其范围(函数或块)内通过被推入堆栈内时进行声明分配,并在作用域完成时被“释放”(结束)功能或块)从堆栈中拉出。
这不是动态分配而是自动分配。您只能使用 new 运算符执行动态分配,并且您的变量将在运行时分配在我们称为堆的内存的特殊区域内。你必须小心动态分配,因为你需要明确地使用 delete 运算符来释放它。
注意:前面关于堆栈的解释是一种简化。变量并非真正从堆栈中拉出来。堆栈由两个指针控制:一个指向堆栈的底部,另一个指向顶部,即下一个可用位置。当一个函数被调用时,它的变量被添加到堆栈中,修改第二个指针的位置,当函数结束时,该指针采用与函数开头相同的值,有效地释放函数中使用的内存。因此,变量并未真正被拉动,您只需在堆栈的后续迭代中覆盖它们。
有关详细信息,请参阅 C ++ Primer Plus第9章。内存模型和命名空间
答案 5 :(得分:0)
每次调用f()
时,都会在堆栈上创建a
。当您编译代码并且编译器生成代码的二进制等效时,编译器会编写必要的指令以在a
的堆栈上分配空间。它只是递增/递减CPU寄存器(known as stack pointer)。由于堆栈指针的递增/递减是由编译器完成的(通过写二进制指令),因此不是动态分配。函数返回后,空间将自动恢复。这也可以通过更改堆栈指针的值来实现,并且编译器在二进制文件上写入必要的指令来执行此操作。
Dynamic memory allocation是指编译器不为您保留内存的过程。相反,该空间由操作系统在运行时分配。空间来自RAM的堆区。程序员负责释放该空间,编译器不会对此做任何事情。动态内存分配的编码方式与new
一样:
int *prt = new int[10];
编译器不为10个整数保留内存。而是向OS请求保留该内存。执行此代码时,OS会保留内存(如果有足够的内存可用),并返回指向内存开头的指针。