[英]Memory Allocation
当我们在函数内部定义一个变量(这里不是主变量)时,是在运行时完成内存分配还是为我们服务器?
当我有以下情况时会发生什么:
int f()
{
int a=10;
........
}
main()
{
int i;
scanf("%d",&i);
while(--i)
f();
..........
}
函数f()中的'a'是否创建'我'? 动态分配也是如此?
在每次调用f()
期间生成局部变量a
。 它是为f()
设置'堆栈框架'的一部分,并且几乎没有任何时间成本。 它占用了一个小堆栈空间,但不超过int
必要条件。
在while(--i) f();
函数f()
调用10次,每次一个“新” a
占用的存储器中的相同点。 我们不调用这种动态分配,它被称为堆栈,本地或自动分配。
这是一个堆栈分配,意味着该位置在堆栈上保留为整数 - 它没有像“在堆上找到4个空闲字节并为我分配它们”那样分配。
Q1。 是..它将在堆栈中分配i
次..
Q2。 否..使用new
关键字分配的内存是动态内存分配,它将在堆中分配,并且在您提供的示例中进行的分配是堆栈分配的..
变量在堆栈上分配,而不是“动态内存”。 是的,一次将被放在堆栈上。
通常,在函数中定义变量时,内存分配在运行时完成,变量存储在堆栈中,表示这类变量的存储系统:局部变量。
是。 在您提供的示例中,变量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章。内存模型和命名空间
每次调用f()
,都会在堆栈上创建a
。 当编译代码,编译器生成的代码的二进制等效,编译器写入必要的指令,以对堆栈分配空间为a
。 它只是递增/递减CPU寄存器( 称为堆栈指针 )。 由于堆栈指针的递增/递减是由编译器完成的(通过写二进制指令),因此不是动态分配。 函数返回后,空间将自动恢复。 这也可以通过更改堆栈指针的值来实现,并且编译器在二进制文件上写入必要的指令来完成。
动态内存分配是指编译器不为您保留内存时的过程。 相反,该空间由操作系统在运行时分配。 空间来自RAM的堆区。 程序员负责释放该空间,编译器不会对此做任何事情。 动态内存分配的编码方式与new
相似:
int *prt = new int[10];
编译器不为10个整数保留内存。 而是向OS请求保留该内存。 执行此代码时,OS会保留内存(如果有足够的内存可用),并返回指向内存开头的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.