繁体   English   中英

内存分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM