📜  什么是动态内存分配?

📅  最后修改于: 2021-05-30 04:24:28             🧑  作者: Mango

资源永远是溢价。我们一直努力争取更好地利用资源;这是我们进步的前提。与这种追求相关的是内存分配的概念。

必须为我们创建的变量分配内存,以便可以使实际变量存在。现在,我们认为它如何发生以及它实际如何发生存在一个约束。

计算机如何创建变量?
当我们想到创建东西时,我们想到的是从头开始创建东西,而这并不是计算机创建变量“ X”时实际发生的事情。在计算机上,更像是分配,计算机只是将许多现有内存单元中的一个内存单元分配给X。这就像一个名为“ RAJESH”的人从许多空闲或空空的房间中分配给酒店房间一样现有的房间。该示例可能非常清楚地说明了计算机是如何进行内存分配的。

现在,什么是静态内存分配?当声明变量时,实际上我们正在准备将要使用的所有变量,以便编译器知道所使用的变量实际上是用户想要的程序的重要组成部分,而不仅仅是浮动的流氓符号。因此,当我们声明变量时,编译器实际上所做的就是将这些变量分配给它们的房间(请参阅前面的酒店类推)。现在,如果您看到这是在程序执行之前完成的,那么在程序执行时就无法通过此方法分配变量。

// All the variables in below program
// are statically allocated.
void fun()
{
   int a;
}
int main()
{
   int b;
   int c[10]
}

为什么我们需要引入另一种分配方法才可以完成工作呢?为什么在程序执行时需要分配内存?因为,尽管它不是很明显,但在运行时无法分配内存会妨碍灵活性并损害空间效率。特别是,在事先不知道输入的情况下,我们在存储使用效率低下以及输入数据的插槽不足或过多(给定用于存储条目的数组或类似数据结构)方面遭受苦难。因此,在这里我们定义了动态内存分配:在运行时可以将存储/内存/单元分配给变量的机制称为动态内存分配(不要与DMA混淆)。因此,正如我们经过的所有过程一样,我们可以说它在运行时分配了内存,这使我们能够使用所需的任意数量的存储,而不必担心浪费。

动态分配内存的原因和优势:

  1. 当我们不知道该程序需要多少内存时。
  2. 当我们想要没有任何存储空间上限的数据结构时。
  3. 当您想更有效地使用您的内存空间时。示例:如果您为一维数组分配的存储空间为array [20],而最终只使用了10个存储空间,那么剩余的10个存储空间将被浪费,并且其他程序变量甚至都无法利用此浪费的内存。
  4. 仅通过操纵地址就可以非常轻松地完成动态创建的列表插入和删除操作,而在静态分配的内存中,插入和删除操作会导致更多的移动和内存浪费。
  5. 当您希望在编程中使用结构和链表的概念时,必须分配动态内存。
int main()
{
   // Below variables are allocated memory
   // dynamically.
   int *ptr1 = new int;
   int *ptr2 = new int[10];
  
   // Dynamically allocated memory is
   // deallocated 
   delete ptr1;
   delete [] ptr2;
}

有两种可用的内存类型:堆栈和堆。静态内存分配只能在堆栈上进行,而动态内存分配可以在堆栈和堆上进行。要在堆栈上进行动态分配的一个示例是递归,在递归中,函数按其出现的顺序放入调用堆栈中,并在到达基本情况时逐个弹出。在堆上动态分配内存的示例是:

int main()
{
   // Below variables are allocated memory
   // dynamically on heap.
   int *ptr1 = new int;
   int *ptr2 = new int[10];
  
   // Dynamically allocated memory is
   // deallocated 
   delete ptr1;
   delete [] ptr2;
}

在堆上分配内存时,我们需要手动删除内存,因为即使分配的内存范围完成了(如堆栈),编译器本身也不会释放(释放)内存。

总结以上主题,静态内存是编译器预先分配的。而动态内存是程序在执行过程中控制的东西。该程序可能会要求更多,或删除一些已分配的内容。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”